質問: ### 背景 テキストを参考にしながら、ruby on railsでツイッタークローンを作成中。 (デザインはbootstrapを使用) ユーザー登録機能は作り、View(`Users/new.html.erb`)も作成。 ユーザー編集機能(PUT)はまだ作成していないが、 今後作ることを見越して、登録事項に不備があった際に表示するエラーメッセージを `layouts/_error_messages.html.erb`として共通化。 ### f.objectを使う理由がよくわからない 下記のコードの際に、テキストだと、ユーザー登録ページの、エラー発生時のメッセージ表示部分(共通化)で `<%= render 'layouts/error_messages', model: f.object %>` と表現するのに、疑問を感じます。 `model: @user`でも問題ないと思われるのだが、なぜ `f.object`を使わなければいけないのでしょうか? 自分がobjectメソッドについての理解が浅いからだけなのかもしれませんが、 誰かわかる方いらしたら教えていただきたいです。 【`Users/new.html.erb`】(一部抜粋) ``` <%= form_for(@user) do |f| %> <%= render 'layouts/error_messages', model: f.object %> <%= f.label :name, 'Name' %> <%= f.text_field :name, class: 'form-control' %> <%= f.label :email, 'Email' %> <%= f.email_field :email, class: 'form-control' %> <%= f.label :password, 'Password' %> <%= f.password_field :password, class: 'form-control' %> <%= f.label :password_confirmation, 'Confirmation' %> <%= f.password_field :password_confirmation, class: 'form-control' %> <%= f.submit 'Sign up', class: "btn btn-primary btn-block" %> <% end %> ``` 【`layouts/_error_messages.html.erb`】 ``` <% if model.errors.any? %> <% model.errors.full_messages.each do |message| %> <%= message %> <% end %> <% end %> ```
回答: > > `model: @user`でも問題ないと思われるのだが、なぜ`f.object`を使わなければいけないのでしょうか? > > > はい、`model: @user`でも問題ありません。ただし、他のページに同じコードを入れ込む際に、`@user`という変数が正しいかどうかはページごとに変化しますが、`form_for (中略) do |f|`と書けば、`f.object`は他のページでもそのまま使えます。