2012-03-20 28 views
6

Railsでネストされたモデルを作成していますが、コントローラー内のネストされたモデルにフィールドを追加したいとします。私はそれが改ざんされる可能性があるので、hidden_​​field_tagを使用していません。Railsでparamsハッシュを変更する

Parameters: {"dummy"=>{"users_attributes"=>{"0"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}, "1"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}}}, "commit"=>"Create Dummy"} 

私がしたいことは企業IDと呼ばれる各user_attributes下のフィールドが存在することはある:

は、ここに私のparamsハッシュです。しばらくの最初の行のエラー:私は「NilClass未定義のメソッド `[]」nilのために」を取得、

len = params["dummy"]["users_attributes"].size 
counter = 0 
while counter < len 
    params["dummy"]["users_attributes"][counter]["companyid" => "company"] 
    counter = counter + 1 
end 

しかし:の私は、「企業」を企業ID、私はこれが働くだろうと思ったかったとしましょうループ。なぜ私は正確にはわからない。

誰かが私を助けて、私がparamsハッシュを変更できますか?

編集: だから、やっと私はそれを理解しました。私は本当に解決策のどれも使っていませんでした。まず、hidden_​​fieldタグをcompanyidのために空白に設定しました。私のコントローラーでは、次のように入力しました。

params["dummy"]["users_attributes"].each do |key, val| 
    params["dummy"]["users_attributes"][key]["companyid"] = "company" 
end 

最も洗練されたコードではありませんが、うまくいきます。

答えて

4

paramsハッシュは特別なものです(特にフォームの場合)。関連するモデルと1対1にマップされているため、Railsはそこにデータベース列またはその名前を持つモデル。

非表示のフィールドは、追加データを取得する問題の典型的な解決方法ですが、ユーザーがこれらのフィールドを表示しないようにするには、HTTPがステートレスであるという問題が発生します。この場合、session[:something]はあなたの友人です。非表示のデータが含まれているフォームやページを表示する前に、データをセッション変数に追加し(最初に暗号化する)、ユーザーがフォームを送信したときに読み取って(解読する)ことができます。または、データベーステーブルに保存し、行IDのみをセッションに入れて、フォームがポストされたときにデータを読み戻すことができます。

データのだったのですが、表示したくない場合は、ユーザーが表示できる部分を表示するだけで、残りの部分をユーザーがフォームまたはリクエストを送信したときのコントローラのアクション

データが敏感でない場合は、単にユーザーがそれぞれのモデルでattr_accessibleように変更できる値を(質量割り当てを防止する)宣言し、隠されたフィールドに他人を入れて確認することができます。

+0

隠されたフィールドの深い議論が解決策を見つけ出すことができたので、私はあなたにチェックをしています。ありがとう! – NielMalhotra

+2

私は正当性が欠けているので、私は冗長で補う。私はJavaのプログラマーだったはずです! (ああ、待っていた、私は)。だから、解決策は何ですか? –

+0

これは元の投稿の編集にあります:フォームのf.hidden_​​field:companyid、次に上記のコードスニペット – NielMalhotra

0

これは醜いと私は何が起こっているか理解していないが、あなたの間違いがある:

len = params["dummy"]["users_attributes"].size 
counter = 0 
while counter < len 
    params["dummy"]["users_attributes"][counter] = { "companyid" => "company" } 
    counter = counter + 1 
end 

私はあなたがここにaccepts_nested_attributes_forを使用して、コントローラに新しい企業を初期化する必要があると考えている、いないこの醜いコード

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

0

これはハッシュの仕組みではありません。これを試してみてください:fl00rの答えに加えて

params["dummy"]["users_attributes"][counter]["companyid"] = "company" 

EDITを、はい、あなたは最初の{}であることを[ "企業ID"]に設定する必要があると思います。

関連する問題