LoginSignup
7
8

More than 5 years have passed since last update.

Rails3.2.9以降ではActiveModelのid項目にオブジェクトを直接設定するとNoMethodErrorになる

Posted at

発生する問題

Rails3.2.8までは以下のようなコードが動いていました。

# Rails3.2.8
hoge = Hoge.find(1)

piyo.hoge_id = hoge

piyo.hoge_id # => 1

Rails3.2.9以降で同じコードを実行すると、NoMethodErrorが発生します。

# Rails3.2.9
hoge = Hoge.find(1)

piyo.hoge_id = hoge
# NoMethodError: undefined method `to_i' for #<Hoge:0x007f9c4bbafe20>

これはハッシュでbuild/createするような場合も同様です。

# Rails3.2.9
hoge = Hoge.find(1)
params = { name: 'fuga', hoge_id: hoge }

piyo.build_fuga(parmas)
# NoMethodError: undefined method `to_i' for #<Hoge:0x007f9c4bbafe20>

解決策

解決策としてはhoge_idにはhogeオブジェクトではなく、hoge.idのように、明示的にidを渡します。

# Rails3.2.9
hoge = Hoge.find(1)

piyo.hoge_id = hoge.id

piyo.hoge_id # => 1

備考

Rails3.2.8からRails3.2.10 or 3.2.11にバージョンアップした場合でも同じ問題が発生するので、注意してください。

参考サイト

7
8
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
7
8