2012-01-09 4 views
0

私は自分自身が大量の割り当てを避けるためにのために、より体系的な解決策を持っていると思います。Railsの中に大量の割り当てを避けるために、paramsハッシュで敏感な要素を交換し

典型的な状況は、(MyController#で作成)(フォームから自動的に提出)のparamsからIDまたはUSER_IDを削除し、内部current_user.idに置き換えることです。

私は考えることができるソリューションは、内部の値で敏感な属性を置き換えるために、その後update_attributes(親と子オブジェクトの)、ハッシュのparamsからオブジェクトを作成することです:

@user = User.create(:params[:user]) 
@user.update_attributes(:id => current_user.id) 
@user.profile.update_attributes(:user_id => current_user.id) 
@user.preference.update_attributes(:user_id => current_user.id) 

が短い/よりDRY方法はありますこれを言う?

好み場合などユーザープロファイルの子オブジェクトは、(ビルドメソッドを介して作成)され、どのように私は、ユーザーのために自分の外部キーを探し、自動的に私が親に渡された値とそれらを交換する方法を記述することができますか?

ありがとうございます。

答えて

1

これは、attr_protectedattr_accessibledocumentation)です。 attr_protectedはブラックリスト保護を、attr_accessibleはホワイトリストを使用して保護します。

大量割り当ての直後にupdate_attributesを呼び出している間は、モデルに質量割り当てを行うたびにコードの重複を必要としないため、大量割り当てを保護する組み込みの方法を使用する方がよいでしょう。

+0

おかげザカリー。 attr_accessibleでやろうとしていたことをどうやってやるのか詳しく教えてください。私はattr_protectedなどについて知っていますが、DRY方法で保護された属性を割り当てる方法がわかりません。 – AdamNYC

+0

これは 'attr_protected'と同じように動作しますが、ブラックリストではなくホワイトリストです。したがって、 'name'、' email'、 'password'という名前の属性を持つ場合、' attr_accessible:name、:email、:password'を実行すると、これらの3つの属性のみを割り当てることができます。 –

+0

申し訳ありませんが、私の質問は、あなたのコントローラでこれらの保護された属性をどのように実際に扱うのですか? – AdamNYC

1

私が使用して以前のプロジェクトでこれをやった:

@user = User.create(params[:user]) do |user| 
    user.id = current_user.id 
end 

うこの作品をあなたのため?

代わりにdocsをチェックして、ロールベースの属性の:asを検索してください。

+0

ありがとうLasse。それはうまくいくかもしれませんが、それはまだ私にとっては少しアドホックです。さらに、すべての子オブジェクトをスキャンしてuser_idをcurrent_user.idに置き換えたいとします。 – AdamNYC

関連する問題