rails5.1でfindの引数にActiveRecordを指定するとエラー

投稿者: Anonymous

railsチュートリアルの13.1.3の演習課題2:
(https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-user_micropost_associations)

先ほどの演習課題で、データベース上に新しいマイクロポストが追加されたはずです。user.microposts.find(micropost.id)を実行して、本当に追加されたのかを確かめてみましょう。また、先ほど実行したmicropost.idの部分をmicropostに変更すると、結果はどうなるでしょうか?

についてuser.microposts.find(micropost)を実行すると、

ArgumentError: You are passing an instance of ActiveRecord::Base to `find`. 
Please pass the id of the object by calling `.id`.

from /Users/username/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/active_record/relation/finder_methods.rb:461:in 
`find_one'

となりエラーになります。
一方、Railsチュートリアルの解答を個人的に掲載しているサイト様によると、この演習課題の解答は

DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to `find`. Please pass the id of the object by calling `.id`. (called from irb_binding at (irb):4)

となりワーニングは出るものの引数にmicropost.idを指定した時と同じくMicropostが
取得できる様です。

上述のサイト様ではバージョンが
Rails 5.0.1
ruby 2.3.0
で、私が行なっているチュートリアルではバージョンが
Rails 5.1.4
ruby 2.4.2
です。(RailsチュートリアルではRailsのバージョン5.1.2が指定されていますが敢えて2017/11時点の最新にしています)

Railsのバージョンが上がる際にfindの引数に関して仕様変更があったのでしょうか。
Githubを見てもよくわからなかったためここで質問させてください。

解決

4.2の時点で警告が出るようになっています。5.0ではそのままだったようですが、5.1でArgumentErrorが出るように変更されていますね。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *