web-dev-qa-db-ja.com

Rails 4つの強力なパラメーター-欠落しているモデルパラメーターハッシュの処理

モデル:投稿とユーザー

投稿belongs_to:user
ユーザーhas_many:posts

シンプル。

数人のユーザーが存在すると仮定して、投稿の編集ページにアクセスします。

<%= form_for @post do |f| %>

.。

<% User.all.each do |user| %>
  <div><%= f.radio_button "user_id", user.id %></div>
<% end %>

.。

PostのコントローラーはRails 4つの強力なパラメーターを活用します。

params.require(:post).permit(:user_id)

投稿の編集フォームには、フィールドとしてラジオボタンしかないものとします。

問題:ActionController :: ParameterMissing例外がスローされます。paramが見つかりません:post

Post paramsハッシュが作成されないため、上記の例外がスローされます。空のラジオボタンは、たとえば空のテキストフィールドとは異なり、モデルのパラメータハッシュの作成をトリガーしません。

Postモデルでuser_idが有効である必要がある場合はどうなりますか?確かに、投稿を保存できない理由でビューを再度レンダリングしたいと思うでしょう。

質問:Rails規則に固執しながらこの状況を処理するためのエレガントな方法は何ですか?

更新:

これについてさらにブレインストーミングすると、この問題を引き起こす状況は他にもたくさんあると思います。必ずしもラジオボタンに対応しているわけではありません。

17
Benjamin

私も同様の問題を抱えており、これらの答えのどちらもあまり好きではありませんでした。 Railsドキュメント( http://guides.rubyonrails.org/action_controller_overview.html#more-examples )には、次の解決策があります。

params.fetch(:blog, {}).permit(:title, :author)

事実上、デフォルトの{}を指定していますが、これは(少なくとも私の状況では)十分に機能しているようです。

コードに適用すると、次のようになります。

params.fetch(:post, {}).permit(:user_id)

これはかなりクリーンで、私のコードでは機能しているようです。

29
PaulL

これは私の当面の解決策でした...あなたが明らかにポストコントローラーにいて、とにかくそれらを必要とするのに、なぜあなたはポストパラメーターをチェックしなければならないので、それは少しばかげているように見えますが。非常に直感に反しているようです。これは本当に最良の方法ですか?

  params.require(:post).permit(:user_id) if params[:post]
4
Benjamin