Rails関連のことを調べてみた2022年06月08日

Rails関連のことを調べてみた2022年06月08日
目次

[Rails] undefined method `has_many’ for main:Objectと出てきた時

### はじめに
DM機能を実装中に
`undefined method ‘has_many’ for main:Object`
という見たことがなかったエラーに遭遇したので記事にしました。

### 結論
今回の場合は`has_many`のせいではなく`room.rb(Roomモデル)`の一行目の記述が何故か消えてしまった事によるものでした。
“`ruby:room.rb
class Room < #この部分が消えていた! has_many :users, through: :user_rooms has_many :chats, dependent: :destroy has_many :user_rooms, dependent: :destroy end ``` 正しくは ```ruby:room.rb class Room < ApplicationRecord has_many :users, through: :user_rooms has_many :chats, dependent: :destroy has_many :user_rooms

元記事を表示

「Rails パフォーマンスチューニング」viewファイルで起こるN + 1問題の修正方法

controller側ではなく、viewのeachでN + 1が発生していたので修正しました。

Ruby:3.1
Rails:7.0.2.3
MySQL:8.0

## 仕様
– userはcompanyをお気に入り(favorite)登録することができる
– favoriteは中間テーブル
– companyに紐づくfavoriteの中に、ログイン中のuser.idと同じものがあればCSSのclassを追加

上記の仕様を、この様に書いていた。

“`ruby:companies_controller.rb
class CompaniesController < ApplicationController def index @companies = Company.all.includes(:addresses).page params[:page] end end ``` ```erb:index.html.erb <% @companies.each do |company| %>

<% if company.favor

元記事を表示

FakerBotがActiveHashのバリデーションにかかってしまう問題の解決法

FakerBotを使ってActiveHashを含んだテストコードを作成しようとした際、問題が発生してしまったので、その問題と解決法を書いていきます。
## 問題点:FactoryBotがバリデーションにかかるidを選択してしまい、テストに失敗する
“`ruby
class Prefecture < ActiveHash::Base self.data = [ { id: 1, name: '---' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' }, ``` ```ruby class Item < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions validates :prefecture_id, numericality: { other_than: 1 } ``` 選択肢の'---'に該当するprefecture_id: 1を選択すると、バリデーションにかかるように設定してあります。 ```ru

元記事を表示

動的にフォームを追加、削除する

# 追加した分もDBに保存したい

初投稿です。

フォームを追加、削除する記事はいくつかあったのですが、
DBに保存できるようにする記事は見つけられなかったので備忘録として投稿します。

初学者なのでアラが目立つコードだと思いますが、どなたかの役に立てば幸いです。

間違えや、添削があればコメントにて教えていただければものすごく嬉しいです。

“`ruby:new.html.rb


<%= javascript_pack_tag 'addForm.js'%>

<%= f.fields_for :ingredients do |ingredient| %>

<%= ingredient.text_field :name, id:"ingredient-name_0", p

元記事を表示

動的に表示したDOMに対してjQueryでfocus()する方法

jQueryの.focus()を使ってinputタグに自動的にマウスカーソルのフォーカスを当てようとしていたのだけれど、うまくいかない。
しかしこの方法で別のDOMに対してはfocusできていたので、jQueryのバージョンだとかそういう要因ではなさそうだった。

よく考えると今回フォーカスを当てたいDOMは普段は隠れていて、ボタンを押した時だけ出てくるミニモーダルの中のinputタグだった。このボタンを手動で押してミニモーダルを開いた場合には自動的にフォーカスが当たるのだけれど、それ以外の方法(今回は onclick → trigger(“click”)による自動?クリックでミニモーダルを出現させていた)では動作していないようだ。

解決した方法:

ミニモーダルをdisplay:blockなりで出現させてから.focusするまでにsetTimeoutで100ミリ秒待つようにしたら普通に動いた。

ちなみに:

.focus()だけじゃなく.select()もこの方法で動いた。
せっかくなので.focusを.trigger(“focus”)に変えておい

元記事を表示

【Rails】ActionCableの実装〜mapメソッドについて〜

## はじめに
実装の流れは長くなるので省略させていただきます。
自分が疑問に思ってノートに記録した物を記事にしていきます。

## 前提条件
Ruby 2.6.3
Rails 6.1.5

## 外部キー制約
references型の特徴
**・外部キー制約がつかない。そのため、foreign_key: trueをつける。
・_idが省略される**

中間テーブルに使用です。

“`php:migrate
# 外部キー制約:外部にその値を主キーとして持つ他のテーブルがあること
t.references :chat_room, null: false, foreign_key: true
“`

## mapメソッド
中間テーブルのChatRoomUserから、条件を書いて配列を作ることで、
createする際の条件分岐に使用。

ログインユーザーが存在しているチャットルームデータを取得

“`php:chat_rooms_controller.rb
ChatRoomUser.where(user_id: current_user.id).map(&:chat_room)
`

元記事を表示

Railsのヘヴィな重い一覧ページを改修したお話。

# 問題
User一覧画面、表示までに**20秒**ほどかかっていた。
メモリ食い過ぎで*サーバーが落ちる*こともあった

# 結論
一覧画面に**不必要なモーダル**の切り分け
ハイパー**N+1**問題
を解決することで表示時間が1秒ほどになった。

## 詳細

一部抜粋したコード(説明に不必要な箇所は省いています)

“`ruby:customers_controller.rb
CustomersController
def index
@customers = Customer.all
end
“`

“`erb:index.html.erb
<% @customers.each do |customer| %>

<%= customer.mail %> <%= customer.foobar %> <%= customer.hoge %>
元記事を表示

Rails 診断機能を実装する タグ機能 マッチ度判断

# 実行環境

“`
ruby 3.0.2
Rails 7.0.2.3
“`

GitHubはこちら

https://github.com/kakeruAoyama/diagnose_games

### DB設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/4284be8d-06aa-e9d6-8385-70fb2a9f9f1e.png)

GameとTagが多対多のアソシエーションで結びついている

### 診断機能の概要
gameに紐づいたタグと、ユーザーが質問に答えた回答がマッチしている数が一番多いものが表示される。
すなわち、gameに[tag1, tag2, tag3, tag4]が紐付いている場合、ユーザーの回答が、[tag1, tag2, tag3, tag5]であったならば、マッチ度は75%として表示される。
ただし、[tag1, tag2, tag3, tag5]というgameが他に存在した場合は、こちらがマッチ度100%として表示される。

#

元記事を表示

Railsでmigrationかけた後にブランチをチェックアウトしてしまった時の復旧方法

rails db:migrate掛けたことを忘れて、新ブランチにチェックアウトした後
既にテーブルが作成されていることからmigrateができなくなってしまった時の復旧方法

まず、migrateしてしまった時のブランチにチェックアウトします。

そして以下のコマンド
“`zsh
rails db:migrate:status
“`

そうするとこうなっているはず。
“`zsh
Status Migration ID Migration Name
————————————————–
up 20220606000001 Create hoge
up 20220606000002 ********** NO FILE **********
down 20220606000003 Create fuga
“`
********** NO FILE **********
これはmigrate した後にコミットしなかったことで、存在しないファイルがmigrateされて

元記事を表示

【Rails】DBから最新データが取得されていない時の対処法

# 初めに

ポートフォリオのライク機能を作成した際に、`DB`のデータは変更されているのにインスタンスのデータは更新されていなかった。

## 環境

– Rails 6.1.4
– Ruby 2.7.4

## 結論

`SQLキャッシュ`がされていたので、同じ`SQL`を発行した場合キャッシュされたデータ(更新前のデータ)が返ってきた。

# 解決方法

`SQLキャッシュ`は

– 同じクエリが発生すると、データベースへのクエリを実行せずに、キャッシュされた結果を返す
– `SQLキャッシュ`は、アクションの開始時に作成され、アクションの終了時に破棄されるので、アクションの実行中しか保持されない。

なので、`reload`メソッドを利用することでキャッシュを使わずに再取得できます。

“`ruby:like_controller.rb
class LikesController < ApplicationController def create review = Review.find(params[:review_id]) like = Like.

元記事を表示

begin rescue 文

## find
与えられたどのオプションにもマッチする“`「主キー」に対応するオブジェクト“`を取り出せます。
“`
irb> customer = Customer.find(10)
“`
カラム名をつけなくていい。

## find_by
与えられた条件にマッチするレコードのうち“`最初のレコードだけ“`を返します。
“`
irb> Customer.find_by first_name: ‘Lifo’
=> #

irb> Customer.find_by first_name: ‘Jon’
=> nil
“`
カラム名をつける

“`rb
irb(main):001:0> user = User.all
TRANSACTION (0.1ms) BEGIN
User Load (0.4ms) SELECT `users`.* FROM `users`
=>
[# post = Post.

元記事を表示

[初心者用]Railsチュートリアル アプリ作成〜ユーザー登録

## はじめに
Railsチュートリアルを一通り学びポートフォリオ作成に入る前に内容の確認兼、ポートフォリオをチュートリアルの内容を確認しながら作成できるよう大まかにまとめます。

## プロフィール
プログラミング未経験 金融機関勤務 社会人3年目 
web系エンジニア転職のため、2022年3月ごろにProgateを初めて触りweb制作を中心に学習。

## Railsチューリアルの流れ
※ポートフォリオ作成方法にの大まかな流れ関してまとめるため、環境構築やhtml cssの具体的なコード等については省略します。
アプリ名    sample_app
コントローラ名 User
モデル 
|Users|
| —- |
|id|
|name|
|email|
|password_digest|
|remember_digest|

### ・アプリの新規作成とコントローラ、モデル作成
“`rails new sample_app“`をコマンド実行し、もとになるファイルなどを作成
“`rails g controller Users [アクション名]“`を

元記事を表示

Railsをデプロイする時、した時のトラブルシューティング

# 前提
開発環境はCloud9
デプロイはHerokuにするものとする
勉強時に置きたエラーと解決策を書いていく
デプロイの仕方は今回は割愛

# git pushするとエラーになる
### エラー内容
普通に書いてエラーなく操作できているファイルをアップしたとしてもこんなエラーが

“`言語:タイトル
ArgumentError: wrong number of arguments (given 3, expected 2)
“`
簡単に説明すると
>引数が2個のはずやのに3つ渡してるぞ!!

って怒られる
書籍や動画で学んでて仮にコピペしててもなるときはある
>んなもん無理じゃん

って思ったけど大丈夫
この記事で解決
https://qiita.com/yoppy_yophy/items/af0d9eea05e524e52922
もちろん全体の記事も大切だけどこの記事の「対処」の部分を読んでほしい

### エラー内容
さぁHerokuにデプロイできたぜ!
動作確認だ!
って気合入れたらこれ

![68747470733a2f2f71696974612d696d6167

元記事を表示

Rails 地図を簡単に表示させよう HTML埋め込み編

# 完成スクショ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/2a79a2a3-6757-8b10-3cd4-12f71860d943.png)

# 機能の概要
投稿ごとに地図を表示させる
表示させる地図は、HTMLの埋め込みで実装

# カラムの追加

“`
$ rails generate migration AddDetailsToPost map_emb:string
$ rails db:migrate
“`

# 投稿時に、Mapの埋め込みを保存させる

“`erb:new.html.erb

<%= f.label :map_emb %>
<%= f.text_field :map_emb %>

“`

“`ruby:posts_controller.rb
def post_params
params.require(:post).permit(~~~

元記事を表示

Railsプロジェクトに監視ツールSentryを導入する

Railsの監視ツールであるSentryを導入した際に、まとまっていて欲しかった情報をまとめました。

# 環境

“`ruby

$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]

$ rails -v
Rails 5.2.5

“`

# 事前準備

– sentryの公式ページからアカウントを発行しておくこと

公式:
https://sentry.io/auth/login/o/

# インストール

– 旧式でRavenという名前になっているが、今はSentryに統一されている
– Sentryの公式ドキュメントを参照するとよい
– 以下はマニュアル通り

https://docs.sentry.io/platforms/ruby/guides/rails/

まずはライブラリをインストール

“`Gemfile.rb
gem “sentry-ruby”
gem “sentry-rails”
“`

“`
$ bundle install
“`

設定ファイルに、Sentry公式

元記事を表示

モデル、データベース

### モデルとは
モデルとはアプリケーションのデータや処理を扱う部分です。
データベースにアクセスし、データの取得、更新、削除などの処理を行います。

### データベースとは
モデルとやり取りを行うのがデータベースです。
データベースは名前の通り、データを格納する保存先です。
しかしただ保存されているのではありません。保存されているだけではモデルが該当データの取得等をする際に時間がかかってしまうからです。
データベースではテーブルというもののなかにそれぞれジャンル分けされた状態でデータが保存されています。
ECサイトを例に挙げると、商品名、商品説明、価格、会員情報、購入履歴などのテーブルにそれぞれ該当のデータが格納されていることになります。

###### カラムとレコード
データベースのテーブルはさらに分化することができます。それが「カラム」と「レコード」です。
イメージ的にはカラムはテーブルの題名、レコードはテーブルの内容です。
先述の例をもとにかんがえるといちごのデータが格納されていたとします。
商品名:いちご
商品説明:甘い
価格:100円
「商品名」「商品説明」「価格」が

元記事を表示

ルーティング・コントローラー・ビュー

railsを扱う上で理解しておいたほうが良い基礎知識を自分用にまとめました。
### ルーティングの役割
ユーザーがURLにアクセスした際に初めに要望を受け取るのが「ルーティング」です。
ルーティングはブラウザや、ブラウザ内のフォームからの要望を受け取り、受け取った要望の内容によって、どのコントローラーのどの処理を実行するかを判断し実行します。
“`
get ‘homes/top’ => ‘homes#top’
“`
この記述の場合はhomes/topのURLをgetつまり新しくページを作成するとき、homesコントローラーのtopアクションを使用します。

### コントローラーの役割
ルーティングで判断された内容をもとに、決められた処理を実行した上で、対応する画面を表示させます。
上記の例の場合、homes/topの画面を表示させます。

### ビューの役割
コントローラーから呼び出した対応する画面をどのような見た目で、どこに処理したデータを入れ込むかを書いておくファイルになります。 ブラウザに表示させるHTMLを実際に組み立てます。
ビューで見た目や動きを設定しておかなけれ

元記事を表示

?【初学者用】RSpecでテストコードを書こう!⑤【FactoryBot・Faker】

# はじめに
今回でテストコードについては最後の投稿になります。
前回までの投稿はこちら↓

①?【初学者用】RSpecでテストコードを書こう!【概念・準備】

https://qiita.com/hondano_gentuki/items/2003971a4f5a97481930

②?【初学者用】RSpecでテストコードを書こう!②【簡単な実装例】

https://qiita.com/hondano_gentuki/items/0a91a595df9c0d76f1cc

③?【初学者用】RSpecでテストコードを書こう!③【コントローラーの単体テスト簡単な実装例】

https://qiita.com/hondano_gentuki/items/7f5a36c08b9785022d33

?【初学者用】RSpecでテストコードを書こう!④【結合テストの簡単な実装例】

https://qiita.com/hondano_gentuki/items/ac52c47570c747f9a6d8

# FactoryBot
テストコードを書く際に、`user = User.new(nic

元記事を表示

Docker Rails + Reactの本番環境構築(ubuntu + Apache + rails + React + MySQL)

# はじめに
バックエンドをrailsで、フロントエンドをreactのアプリケーションを開発した際の、環境構築に苦戦したため、備忘録もかねて投稿します。
とりあえず動くとこまでなので、dockerの利点を生かせていなかったり、セキュリティ関連の設定などは行っていません。
間違いなどあればご指摘いただけると幸いです。

# 前提
railsアプリとreactアプリは開発環境で開発し、完成したものを持ってきて本番環境を構築しました。
そのため、本投稿の構成では開発段階を考慮していません。
継続的に改修していく場合にどうするかが課題です。

# コンテナ構成
##### serverコンテナ
このコンテナにMySQL以外の全てのサービスを詰め込んでしまいます。
dockerは1コンテナにつき1サービスが好ましいので良くない構成かもです…
開発環境ならrailsやreactをそれぞれが持つフレームワーク付随のサーバで良いため、コンテナを分けられますが、webサーバとしてapacheを使用した場合の構築方法が分かりませんでした。
今後の課題です。

##### dbコンテナ
このコンテナには

元記事を表示

Railsにおけるキャッシュストア比較表

# 比較表

主にメリット・デメリットを比較したり、利用シーンをまとめてみました。

|                                 |  FileStore  |  MemoryStore  |  MemCacheStore  |  RedisStore  |
| :— | :— | :— | :— | :— |
| プロセス間共有 | ○ | ✗ | ○ | ○ |
| スレッドセーフ | ○ | ○ | ○ | ○ |
| ホスト間共有 | ✗ | ✗ | ○ | ○ |
| 無料 | ○ | ○ |

元記事を表示

OTHERカテゴリの最新記事