LoginSignup
0
0

More than 1 year has passed since last update.

ActiveHashのname出力でNoMethodError

Last updated at Posted at 2021-09-15

おそらく同じケースに陥っている方は僅少かと思いますが
かなり初歩的なミスだったので
戒めも兼ねて記録します。

  1. 問題
  2. 状況
  3. 分析
  4. 解決法

1. 問題

複数のActiveHashのname表示において
一部のモデルのみNoMethodErrorとなってしまっています。
Image from Gyazo

2. 状況

・users/:idのパスにてusers#showアクション呼び出し
・ビューの項目のうち複数でActiveHashを利用(下記show.html.erb参照)
・一部の項目では正常にnameが呼び出される(下記ターミナル参照)

users/show.html.erb
<%= @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について
以下のように記述してしまっていました。

models/user.rb
belongs_to :active_day, :character, :genre, :leader_or_member, :prefecture,:sex, :skill, :what_play

belongs_toのモデル名は
validatesのカラム名のように
,
を使った複数の記述はできません。
その為に最初のカラムのみ
アソシエーションがかかっていました。

これを修正します。

models/user.rb
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


以上の処理によって
無事に表示がされるようになりました。

Image from Gyazo

今回はここまでです。

お読みくださりありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0