39674


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)`を実行すると、

[code]

    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'
    
[/code]

となりエラーになります。  
一方、[Railsチュートリアルの解答を個人的に掲載しているサイト様](http://mochikichi.hatenablog.com/entry/2017/03/18/085107)によると、この演習課題の解答は

[code]

    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)
    
[/code]

となりワーニングは出るものの引数に`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](https://github.com/rails/rails)を見てもよくわからなかったためここで質問させてください。


CC BY-SA 3.0
2017-11-18T06:44:09.287
39673
2017-11-18T07:04:48.127
23722
question
ruby-on-rails ruby rails-activerecord
rails5.1でfindの引数にActiveRecordを指定するとエラー


[4.2](https://github.com/rails/rails/commit/d92ae6ccca3bcfd73546d612efaea011270bd270)の時点で警告が出るようになっています。5.0ではそのままだったようですが、[5.1](https://github.com/rails/rails/commit/4b6709e818177792735e99a70ec03210c0ac38dc)でArgumentErrorが出るように変更されていますね。


CC BY-SA 3.0
2017-11-18T07:04:48.127
39674
2017-11-18T07:04:48.127
17037
39673
answer