2013-06-27 12 views
17

モデルを欠落取り扱い: 投稿やユーザーRailsの4つの強力なパラメータ - モデルのparamsハッシュ

ポストbelongs_toの:ユーザー
ユーザーにhas_many:ポスト

シンプル

。少数のユーザーを想定し

が存在し、我々はポストの編集ページをご覧ください。

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

...

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

...

ポストのコントローラーは、Railsの4つの強力なパラメータを利用しています。

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

編集ポストフォームにはフィールドとしてラジオボタンしかないとします。

問題:ActionController :: ParameterMissing例外がスローされます。 PARAM見つかりません:ポストのparamsハッシュいる投稿

理由は、上記の例外がスローされるように引き起こして、作成されることはありません。たとえば、空のテキストフィールドとは異なり、空のラジオボタンは、モデルのパラメータハッシュを作成するようトリガーしません。

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

質問:規則をレールに付着しながら、このような状況を処理するためのエレガントな方法は何ですか?

UPDATE:

はさらにこれについてブレーンストーミング、私はこの問題を生成する他の状況の多くは、おそらくそこにあると確信しています。必ずしもラジオボタンに対応するとは限りません。

+0

私はさらに奇妙な問題があります...私はモデルのハッシュのために見つけられない同じparamを得るが、私がテストしているのはform_for @userの2つのユーザのフィールドを持つものであり、それはそれである。私のURLはユーザー名を使用して発生し、私はそれがIDまたは何かが不足していたと思うだろう。私は同じことをする私のプロジェクトの別の部分を持っています。唯一の違いは、足場からではなく最初からこのフォームを作成したことです。 – dtc

答えて

28

私も同様の問題があり、どちらの回答もあまり好きではありませんでした。レールのドキュメント(http://guides.rubyonrails.org/action_controller_overview.html#more-examples)で、私は以下のソリューションを参照してください。

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

効果的に、あなたは(私の状況のた​​めに少なくとも)十分に機能するように思われる、{}のデフォルトを供給しています。あなたのコードに適用

、あなたが持っていると思います:

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

を、私はこれが合理的にきれいだと思う、と私のコードで動作するようです。

+1

恐ろしいです!これは私が一生懸命探していた解決策でした。 – Ben

+0

PaulLありがとうございます。あなたは私の命を救いました。私もベンのソリューションを使用してみましたが、それは私にこのエラーを与える:属性を割り当てるときは、引数としてハッシュを渡す必要があります。 – cyonder

4

これは私の即時のソリューションでした...なぜあなたはポストコントローラに明確であり、あなたはとにかくそれらを必要とする場合、ポストのparamsをチェックするために持っているので、それは少し愚かなようだけれども。非常に直感的ではないようです。これは本当に最善の方法ですか?

params.require(:post).permit(:user_id) if params[:post] 
+0

これはうまくいきますが、なぜ私は理解しません –

+2

@ConnorLeech元の問題はparams [:post] ifは単にstrong paramsメソッドを実行する前にそれをチェックします。 paramsがまったく存在しない場合、このメソッドは単純にnilを返します。 Nilはすべてのモデルアップデート方法ではないにしても、ほとんどすべてで動作します。ポストパラメータが存在しない場合(強力なパラメータの全体的な点の1つ)、例外がスローされるようにサポートされているので、私はそれがあまり好きではありません。まったく起こっていることは、私が予想される行動とは考えていないことです。 – Ben

+0

コントローラでもparams [:post]をチェックして、さらに値params [:post] [:user_id]に進む必要があります –

関連する問題