おそらく同じケースに陥っている方は僅少かと思いますが
かなり初歩的なミスだったので
戒めも兼ねて記録します。
- 問題
- 状況
- 分析
- 解決法
#1. 問題
複数のActiveHashのname表示において
一部のモデルのみNoMethodErrorとなってしまっています。
#2. 状況
・users/:idのパスにてusers#showアクション呼び出し
・ビューの項目のうち複数でActiveHashを利用(下記show.html.erb参照)
・一部の項目では正常にnameが呼び出される(下記ターミナル参照)
<%= @user.nickname %><br>
---(略)---
<%= @user.sex.name %><br>
<%= @user.character.name %><br>
<%= @user.what_paly.name %><br>
<%= @user.genre.name %><br>
<%= @user.prefecture.name %><br>
<%= @user.active_day.name %><br>
<%= @user.skill.name %><br>
<%= @user.leader_or_member.name %><br>
---(略)---
app/controllers/users_controller.rb:9 UsersController#show:
7: def show
8: @user = User.find(params[:id])
=> 9: binding.pry
10: end
[1] pry(#<UsersController>)> @user.sex.name
NoMethodError: undefined method `sex' for #<User:0x00007fba2d60fbf0>
Did you mean? send
from /Users/okazakiryousuke/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activemodel-6.0.4.1/lib/active_model/attribute_methods.rb:432:in `method_missing'
[2] pry(#<UsersController>)> @user.sex_id
=> 2
[3] pry(#<UsersController>)> @user.active_day.name
=> "火曜日"
#3. 分析
複数のActiveHashのうち
うまく表示されるものとされないものがあるようです。
よって項目によって個別に存在する設定、
ActiveHashのモデル
および
Userモデル
の記述が怪しいと思われます。
#4. 解決法
アソシエーションの記述が間違っていました。
belongs_toについて
以下のように記述してしまっていました。
belongs_to :active_day, :character, :genre, :leader_or_member, :prefecture,:sex, :skill, :what_play
belongs_toのモデル名は
validatesのカラム名のように
,
を使った複数の記述はできません。
その為に最初のカラムのみ
アソシエーションがかかっていました。
これを修正します。
belongs_to :active_day
belongs_to :character
belongs_to :genre
belongs_to :leader_or_member
belongs_to :prefecture
belongs_to :sex
belongs_to :skill
belongs_to :what_play
以上の処理によって
無事に表示がされるようになりました。
今回はここまでです。
お読みくださりありがとうございました。