Ruby関連のことを調べてみた2022年10月14日

Ruby関連のことを調べてみた2022年10月14日

ユーザーの好みに合わせて服をおすすめするアプリを作成しました

未経験からのWeb系エンジニア転職を目指し、ポートフォリオサイトをRuby on Railsで作成しました。

## アプリケーション
  
アプリケーション:[「PICK OUT」](https://warm-stream-98443.herokuapp.com/)
※Herokuで動かしているので最初のページの表示に時間がかかる場合があります
ソースコード:https://github.com/bellmmm/original_rails_app

## アプリケーション概要
アカウントを作成したユーザーに対し、テストを通してユーザーの服の好みを判断し、ユーザーの好みに合わせて洋服をおすすめするアプリケーションです。

## 目的
自分の好きな服、似合う服をはっきりと認識している人は少ないと思います。私もECサイトで服を購入したり店舗で試着をしてみて、しっくりこないと感じたことが多くあります。そこで、人はそれぞれ好まない要素が無意識にあると仮定しました。このWebアプリでは、ユーザーがしっくりこない服をいくつか選ぶことで好まない要素を想定し、それを持たない服をおすすめ商品と

元記事を表示

【解決済】Rspec WrongScopeErrorが発生

Rspecでテストを走らせた際に発生した問題について、備忘録として投稿します。

## 発生した問題
“`ruby:ターミナル
Failure/Error:
raise WrongScopeError,
“`#{name}` is not available from within an example (e.g. an ” \
“`it` block) or from constructs that run in the scope of an ” \
“example (e.g. `before`, `let`, etc). It is only available ” \
“on an example group (e.g. a `describe` or `context` block).”

`name` is not available from within an example (e.g. an `it` block) or from

元記事を表示

CircleCI Herokuへのデプロイ時に’No images to push’エラーが出る場合の解決方法

# 概要
CircleCIでHerokuへのデプロイを実行した際、イメージが見つからないというエラーが発生した。
解決方法についてメモ。
“`bash:エラー内容抜粋
#!/bin/bash -eo pipefail
heroku container:push web -a $HEROKU_APP_NAME
▸ No images to push

Exited with code exit status 1
CircleCI received exit code 1
“`
# 環境
ruby 3.0.2
rails 6.1.4
rspec-rails 5.1.2
CircleCI 2.1

# 先に結論
デプロイ対象ディレクトリにDockerfileが含まれるようにする。

“`yml:.circleci/config.yml
version: 2.1
orbs:
ruby: circleci/ruby@1.4.0
browser-tools: circleci/browser-tools@1.4.0
heroku: circleci/heroku@1.2

元記事を表示

【Rails】コンソール内でmigrateする方法

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## コンソール内でmigrateする方法
コンソールでUserを作成しようとした際にエラーでできず、最終的にコンソール内でmigrateするのに時間がかかったので備忘録にする。

“`
> User.create(name: “山田次郎”)
=> ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation “users” does not exist)

> User
=> User(Table doesn’t exist)

> rails db:migrate
=> NameError (undefined local variable or method `migrate’ for main:Object)
“`

“`
> class CreateUsers < ActiveRecord::Migration[6.0] > def change
> create_table :user d

元記事を表示

【Rails】ActiveStorageはdependent: :destroyをつけなくてもよい

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## has_one_attachedにオプションは不要

“`app/models/user.rb
has_one_attached :avatar
“`

> If the :dependent option isn’t set, the attachment will be purged (i.e. destroyed) whenever the record is destroyed.

“`ruby
has_one_attached :avatar, dependent: :destroy
“`
のようにオプションつけなくても、親モデルが削除されたら付随するavatarも削除してくれる!

https://api.rubyonrails.org/v6.0/classes/ActiveStorage/Attached/Model.html#method-i-has_one_attached

元記事を表示

ActionController::InvalidAuthenticityTokenの対処方法

# 環境
Rails 6.1.6.1
ruby 2.6.8
OS WSL2(Ubuntu 20.04.2 LTS)

# APIを使用したPOSTの際にエラーが起こる
### エラー文
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294147/973e9c1f-9077-c629-0d11-0082f8e4334c.png)

“`
ActionController::InvalidAuthenticityToken in Users::XXXXController#create
ActionController::InvalidAuthenticityToken
“`

## 原因
CSRF対策のトークンが無いことが原因のようです。
※CSRF:クロスサイトリクエストフォージェリ

## 対処方法
protect_from_forgeryをcontrollerに追記することで解決
“`
class Users::XXXXController < ApplicationCont

元記事を表示

【RSpec】データ作成で使える小技

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## テストデータの作成で使える小技

### before

“`ruby
let(:cancel_applicatoions) { create_list(:cancel_applicatoion, 30) }
cancel_applicatoions.each do |cancel_applicatoion|
create(:cancel_applicatoion_status, cancel_application: cancel_applicatoion)
end
“`

### after

“`create_list“`で作成したデータをeachのようにループできる。
“`ruby
create_list(:cancel_applicatoion, 30) do |cancel_applicatoion|
create(:cancel_applicatoion_status, cancel_application: cancel_applicatoion)
en

元記事を表示

Rubyについての記事

# Rubyとは
Ruby(ルビー)は、まつもとゆきひろ氏により開発されたオブジェクト指向スクリプト言語。

元記事を表示

RSpec(Ruby on Railsのテストコードを書くために用いられるGem)の導入

# はじめに
RSpec導入の流れを忘れないために記録に残す。

# RSpec導入の流れ
## 1.Gemの導入
# Gemfile内
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘byebug’, platforms: [:mri, :mingw, :x64_mingw]
gem ‘rspec-rails’, ‘~> 4.0.0’ ⇦この行を追記
end

% bundle install

## 2.RSpecの設定
% rails g rspec:install

<ターミナルで以下が表示されれば問題ない>
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helpe

元記事を表示

ユーザー管理機能(devise)の導入

# はじめに
deviseを用いたユーザー登録機能の実装順序を忘れないように記録に残す。

# devise導入の流れ
## 1.deviseの導入
下記コードの追記と、コマンドの実行

1.gemfileに追記
gem ‘devise’
2.gemインストールのコマンド実行
% bundle install

## 2.deviseの設定に関するファイルの導入
% rails g devise:install

#以下のようなlogが出れば成功
create config/initializers/devise.rb
create config/locales/devise.en.yml
===============================================================================

Depending on your application’s configuration some manual setu

元記事を表示

インスタンス変数を用いて処理を効率化する

ログイン機能のアプリ作った際に、app/helpers/sessions_helper.rb
ファイルに以下のメソッドを定義しました。
“`
module SessionsHelper
def current_user
@current_user ||@current_user = User.find_by(id: session[:user_id])
end

def logged_in?
current_user.present?
end
end
“`
メソッドが呼び出されているviewファイル(app/views/layouts/application.html.erb)
“`
<% if logged_in? %>
<%= link_to "Profile", user_path(current_user.id) %>
<%= link_to "Logout", session_path(current_user.id), method: :delete %>
<% else %>
<%= link_t

元記事を表示

Wikipedia データをスクレイピングする

# 前提
– [Gem](https://github.com/kenpratt/wikipedia-client) の使い方について
– ruby 2.7.4p191
– wikipedia-client (1.15.0)

# サマリー
– Gem の機能
– 指定されたタイトルのページ情報を取得する
– [Wikipedia データ取得用の API](https://www.mediawiki.org/wiki/API:Main_page) の結果を返す
– ページ情報の IF がいくつか用意されている
– タイトル、サマリー、テキスト全体、、
– 特定項目の内容を取得したい場合は、自前で抽出する必要がある
– 例. テキスト全体から正規表現で抽出
– 標準 IF にない情報は、生データ取得 IF から別途取得すれば良い

# 使い方
“`ruby
require ‘wikipedia’

# ローカル設定を行う
wikipedia_client = Wikipedia::Client.new(Wikipe

元記事を表示

【Ruby】ネストしたHashをselectメソッドを使って検索する方法

## 今回行いたいこと
“`
@drinks{:cola=>{:price=>120, :stock=>5},:redbull=>{:price=>200, :stock=>5},:water=>{:price=>100, :stock=>5}}
@slot_money = gets.to_i
“`
– 上記のHashの:priceの値と@slot_moneyを比較し、購入可能なドリンクのみを入れたリストを作りたい。また、在庫がある商品のみをリストに表示する。

## 実装条件をもとに考えたこと
– リストを作りたいので、リストを返すメソッドを使用する。
– 比較しなければいけないので、Hashの中身を検索できるメソッドを使用する必要がありそう。
=>find, find_all, selectなど…?

## とりあえず、selectが条件に合いそうなので実験してみる。
selectメソッドについて
> select -> Enumerator[permalink][rdoc][edit]
select {|key, value| … } -> Hash
filter ->

元記事を表示

Python,Ruby,PHP,Java,JavaScript,Perlのソケット通信の比較

Qiita > プログラミング言語の比較

Python,Ruby,PHP,Java,JavaScript,Perlのソケット通信の比較

# Python

https://qiita.com/nadechin/items/28fc8970d93dbf16e81b

# Ruby

https://qiita.com/kudojp/items/d416d4c97f9d0512c088

# PHP

https://qiita.com/shiba0410/items/3102592350039bc1a7b9

# Java

https://qiita.com/Hyman1993/items/a3aaabbb2e83580d68d2

# JavaScript

https://qiita.com/take4eng/items/d0b009c48ee8c3fe420a

# Perl

https://perlzemi.com/blog/200

元記事を表示

【解決済】RailsのHostAuthorizationによってELBのヘルスチェックがhealthyにならない

ポートフォリオをデプロイする際に発生した問題について、備忘録として投稿します。

## 発生した問題
Rails6 + AWSで下記の構成のようなアプリを開発していました。

![インフラ構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2263192/32b8dab2-46ef-7f69-a8c9-85d4cd39d76d.png)

Railsの`HostAuthorization`を利用し、`/api/health_check`というパスでALBからのヘルスチェックを行おうとしました。
しかし、Railsが`403エラー`を返し、ヘルスチェックが失敗してしまいました。

## 原因
Railsの設定は下記のようになっていました。

“`environments/production.rb
config.hosts << 'base_domain.com' ``` 原因は、 **「ヘルスチェック時のホスト名が`base_domain.com`でないからエラーになっていた」** というもので

元記事を表示

【Ruby on Rails】CanCanCan の authorize_resource はレコードの権限まではチェックしてくれない

# CanCanCan
Rails でいい感じにアクセス権を確認したり、作成・更新できるかを確認したり、そんなことができる gem です。

https://github.com/CanCanCommunity/cancancan

以下のような記事が参考になると思います。

https://qiita.com/umanoda/items/679419ce30d1996628ed#model%E3%81%AE%E3%81%AA%E3%81%84%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%B8%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9A

この gem を導入すると、controller で権限認証が楽にできます。

# authorize!
まず、本題の`authorize_resource`の前に、元となる`authorize!`を見てみます。
“`ruby
#books_controller.rb
def show
@book = Bo

元記事を表示

【Rails】M1 Macでシステムスペックの実行時にNet::HTTPServerException: 404 “Not Found”というエラーが出た場合の対処法

## 発生した問題

M1 Macでシステムスペックを実行したら突然以下のようなエラーが発生し、テストが実行できなくなった。

“`
Webdrivers::NetworkError:
Net::HTTPServerException: 404 “Not Found” with https://chromedriver.storage.googleapis.com/106.0.5249.61/chromedriver_mac64_m1.zip
“`

## 原因
Chromedriverの命名規則が変わった影響らしい。

https://github.com/titusfortner/webdrivers/issues/237

## 解決方法
webdrivers gemを5.2.0以上にアップデートする。

“`
$ bundle update webdrivers

$ bundle show webdrivers
/Users/jnito/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/webdrivers-5.2.0
`

元記事を表示

ログインの有無で処理を変える方法

# はじめに
user_signed_in?メソッドの利用方法を忘れないために記録する

## user_signed_in?メソッドとは
Gemのdeviseを導入しているため、使用できるメソッド。
ログインしているかどうかの判定を行う。

#記載方法
<% if user_signed_in? %>

<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "投稿する", new_tweet_path, class: "post" %>

<% else %>

<%= link_to "ログイン", new_user_session_path, class: "post" %>
<%= link_to "新規登録", new_u

元記事を表示

【Ruby on Rails】Model の scope で find_by するのはNG

# scope の罠
先日以下のような scope を見ました。
“`user.rb
class User < ActiveRecord::Base scope :foo, -> (bar) do
return if bar.nil?
find_by(bar: bar)
end
end
“`

もちろん使い方しだいではありますが、この動き、ちょっと想定外だったりするので注意です。

`bar` が `nil` で `return` される場合 (`nil` が返る)、
`find_by` で見つからなくて `nil` になる場合、

このとき、scope の戻りは `nil` ではありません。

`User.foo(nil)` は nil ではありません。

`User.all` が返ります。

(正確には default scope が返る)

## なぜ `nil` が返らないのか

どうやら `scope` は `ActiveRecord::Relation` を返すものだと決まっているよう。
なので`nil`が返るときは default scope

元記事を表示

[Rails]実務を通しての実装ノウハウ集

# 1. チェック対象値が指定の範囲に含まれるか(数値・時間)

“`
(【開始値】..【終了値】).cover?(【チェック対象値】)
“`

補足:
– 【開始値】 <= 【チェック対象の値】 <= 【終了値】になっているかをチェックする - **数値的な範囲、日時的な範囲のチェック** に使える - **日時のチェックに使う場合** - 【開始値】、【終了値】のいずれかがnilである場合は、**十分に過去の日時 or 未来の日時** として扱われる - 類似の実装として``【チェック対象の値】.between?(【開始値】, 【終了値】)``ということもできるが、こちらは **【開始値】、【終了値】どちらかがnilである場合エラーとなってしまう** # 2. 配列要素の重複チェック **2.1. どの要素が重複しているかわからなくてもいい場合** ``` # true:重複あり, false:重複なし 【配列】.size != 【配列】.uniq.size ``` **2.2. どの要素が重複しているか知りたい場合** ``` # dup_valuesは

元記事を表示

OTHERカテゴリの最新記事