2009-04-07 11 views
7

Rails 2.3にはこの新しくネストされたフォーム機能があるので、これには簡単な解決策があったはずだと思いました。基本的に私は、ユーザーを作成または更新し、同時にそれらの役割を割り当てる必要があります。チェックボックス付きのネストされたオブジェクト - accepts_nested_attributes_forの場合でもマス割り当て?

私はすべてのことを正しくやっているようですが、エラーが表示されます警告:これらの保護された属性を割り当てることはできません:roles_attrributes

私は、ユーザーが[permissions_attrributes] [role_id]にビューを変更しようとしても、結合テーブルがRailsを混乱させる可能性があると考えていました。

とにかく、これが実際にどのように機能すべきかに関する提案はありますか?

はモデル

class User < ActiveRecord::Base 

    has_many :permissions 
    has_many :roles, :through => :permissions 

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

ビューからの抜粋(私が試したと私はここに欲しいものを生成するためにfields_forの取得に失敗しました気づく、多分それは私の問題だ?)

<% for role in Role.all %> 
<%= check_box_tag("user[roles_attrributes][id]",role.id) %> 
<%= role.rolename %> 
<br/> 
<% end %> 

のparamsは全体来ているようです右:

{"user"=>{"password_confirmation"=>"[FILTERED]", 
"roles_attrributes"=>{"id"=>"2"}, ... 

ソリューション attr_accessibleを使用せず、permissions_attributesにアクセスする必要があり、フォームがややオフになっています。

モデル:

has_many :permissions, :dependent => :destroy 
has_many :roles, :through => :permissions 
accepts_nested_attributes_for :permissions 
attr_accessible :permissions_attributes 

ビュー:

<% Role.all(:order => "rolename ASC").each_with_index do |role,idx| %> 
    <%= check_box_tag("user[permissions_attributes][#{idx}][role_id]",role.id) %> 
    <%= role.rolename %> 
    <br/> 
    <% end %> 

答えて

3

この属性は、更新のための安全とマークされていないているように聞こえます。あなたのモデルクラスに以下を追加して、それを修正することができるはずです。

attr_accessible :roles 

または可能性:あなたが見れば

attr_accessible :roles_attributes 

、あなたはすでにあなたにこれを追加することができますattr_accessibleコールを有することができます。詳細については、これはここに文書化されています

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002226

+0

accepts_nested_attributes_forはそれを必要としないと私は理解しました。とにかく、私は両方を試してみたが、いずれもうまくいった。 – Bill

+0

このエラーメッセージは、attr_protectedまたはattr_accessibleの問題によって発生するエラーメッセージです。また、http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_forは、それがANAFでも認識していることを示しています。おそらくもっと見る価値がありますか? –

5

あなたの属性のスペルを修正した場合、それが動作するはずのようにそれが見えます。

<% for role in Role.all %> 
<%= check_box_tag("user[roles_attributes][id]",role.id) %> 
<%= role.rolename %> 
<br/> 
<% end %> 
+0

良いキャッチ!それは属性がなぜ認識されなかったのかを説明する=) –

関連する問題