前提・実現したいこと
テーブルの情報を全て取得し、取得した値に紐づいた中間テーブを経由して別のテーブルの値を取得する機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
error
1NoMethodError
該当のソースコード
エラー発生箇所
html
1 <% @task.each do |g| %> 2 <p><%= g.genre_task.genre.user_id %></p> 3 <% end %>
該当箇所のコントローラー
controller
1def index 2 @task = Task.order(id: :DESC).all 3end
Genreモデル
model
1class Genre < ApplicationRecord 2 # validation 3 validates :name, presence: true 4 # association 5 belongs_to :user 6 has_many :tasks, through: :genre_tasks 7end
Taskモデル
model
1class Task < ApplicationRecord 2 # validation 3 validates :name, presence: true 4 # association 5 has_many :genres, through: :genre_tasks 6end
中間テーブルのモデル
model
1class GenreTask < ApplicationRecord 2 belongs_to :genre 3 belongs_to :task 4end
genresテーブル
ruby
1class CreateGenres < ActiveRecord::Migration[6.0] 2 def change 3 create_table :genres do |t| 4 t.text :text 5 t.string :name 6 t.references :user 7 t.timestamps 8 end 9 end 10end 11
tasksテーブル
ruby
1class CreateTasks < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tasks do |t| 4 t.text :text 5 t.string :name 6 t.timestamps 7 end 8 end 9end
中間テーブル
ruby
1class CreateGenreTasks < ActiveRecord::Migration[6.0] 2 def change 3 create_table :genre_tasks do |t| 4 t.references :genre 5 t.references :task 6 t.timestamps 7 end 8 end 9end 10
試したこと
NoMethodErrorと表示されているので、指定しているメソッドが異なると考えネット上で検索をしました。しかしメソッドの指定の仕方を変更してもエラーは解消しませんでした。そこで別の原因もあるのではないかと考えコンソール上で中間テーブの値を取得しアソシエーションができているか確認をしました。
[1] pry(main)> @genre_task = GenreTask.find(1) GenreTask Load (0.4ms) SELECT `genre_tasks`.* FROM `genre_tasks` WHERE `genre_tasks`.`id` = 1 LIMIT 1 => #<GenreTask:0x00007fd038cadae0 id: 1, genre_id: 1, task_id: 1, created_at: Wed, 18 Nov 2020 09:29:14 UTC +00:00, updated_at: Wed, 18 Nov 2020 09:29:14 UTC +00:00> [2] pry(main)> @genre_task.genre Genre Load (0.3ms) SELECT `genres`.* FROM `genres` WHERE `genres`.`id` = 1 LIMIT 1 => #<Genre:0x00007fd03ea07bf0 id: 1, text: "test", name: "test", user_id: 1, created_at: Wed, 18 Nov 2020 09:29:04 UTC +00:00, updated_at: Wed, 18 Nov 2020 09:29:04 UTC +00:00>
そのためアソシエーションの値が取得できないわけではない事が分かりました。
なので中間テーブルの値の呼び出し方が間違っているとは思うのですが、どうすれば良いのか分かりません。
補足情報(FW/ツールのバージョンなど)
Ruby on Rails ver6.0.0
Ruby ver2.6
回答1件
あなたの回答
tips
プレビュー