- 1. 解決した方法:
- 2. ちなみに:
- 2.0.1. 【Rails】ActionCableの実装〜mapメソッドについて〜
- 2.0.2. Railsのヘヴィな重い一覧ページを改修したお話。
- 2.0.3. Rails 診断機能を実装する タグ機能 マッチ度判断
- 2.0.4. Railsでmigrationかけた後にブランチをチェックアウトしてしまった時の復旧方法
- 2.0.5. 【Rails】DBから最新データが取得されていない時の対処法
- 2.0.6. begin rescue 文
- 2.0.7. [初心者用]Railsチュートリアル アプリ作成〜ユーザー登録
- 2.0.8. Railsをデプロイする時、した時のトラブルシューティング
- 2.0.9. Rails 地図を簡単に表示させよう HTML埋め込み編
- 2.0.10. Railsプロジェクトに監視ツールSentryを導入する
- 2.0.11. モデル、データベース
- 2.0.12. ルーティング・コントローラー・ビュー
- 2.0.13. ?【初学者用】RSpecでテストコードを書こう!⑤【FactoryBot・Faker】
- 2.0.14. Docker Rails + Reactの本番環境構築(ubuntu + Apache + rails + React + MySQL)
- 2.0.15. Railsにおけるキャッシュストア比較表
[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 %>