2009-04-07 22 views
7

Tôi nghĩ rằng cần phải có một giải pháp đơn giản cho điều này, vì Rails 2.3 có tính năng biểu mẫu lồng nhau mới lạ này. Về cơ bản tôi muốn tạo hoặc cập nhật một người dùng và gán cho họ vai trò cùng một lúc.Đối tượng lồng nhau w/Hộp kiểm - chuyển nhượng hàng loạt ngay cả với accept_nested_attributes_for?

Có vẻ như tôi đang làm mọi thứ đúng nhưng tôi gặp lỗi CẢNH BÁO: Không thể chỉ định khối lượng các thuộc tính được bảo vệ này: roles_attrributes.

Tôi thậm chí đã thử thay đổi chế độ xem thành người dùng [permissions_attrributes] [role_id] vì tôi nghĩ rằng có thể bảng tham gia đã gây nhầm lẫn Rails.

Dù sao, bất kỳ đề xuất nào về cách thức này thực sự hoạt động?

Mẫu

class User < ActiveRecord::Base 

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

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

Trích từ xem (chú ý tôi đã cố gắng và thất bại để có được fields_for để tạo ra những gì tôi muốn ở đây, có lẽ đó là vấn đề của tôi?)

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

Params tới trên dường như là bên phải:

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

Giải pháp Một sự kết hợp của tôi sai chính tả, không sử dụng attr_accessible, cần phải truy cập permissions_attributes, và các hình thức được tắt một chút.

mẫu:

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

Xem:

<% 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 %> 

Trả lời

3

có vẻ như thuộc tính này không được đánh dấu là an toàn cho việc cập nhật. Bạn sẽ có thể sửa chữa nó bằng cách thêm dòng sau vào lớp mô hình của bạn:

attr_accessible :roles 

hoặc có thể là:

attr_accessible :roles_attributes 

Nếu bạn nhìn, bạn có thể đã có một attr_accessible gọi bạn có thể thêm video này vào. Để biết thêm thông tin này được ghi chép lại ở đây:

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

+0

Tôi hiểu rằng accept_nested_attributes_for không yêu cầu điều đó. Dù sao, tôi đã thử cả hai và không làm việc. – Bill

+0

Thông báo lỗi đó chắc chắn là một thông báo gây ra bởi sự cố attr_protected hoặc attr_accessible. Ngoài ra http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for cho biết đó là điều cần lưu ý ngay cả với ANAF. Có thể đáng xem xét kỹ hơn? –

5

Nếu bạn sửa lỗi chính tả của các thuộc tính trong của bạn, có vẻ như nó sẽ làm việc.

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

Bắt tốt! Điều đó sẽ giải thích tại sao thuộc tính không được nhận ra =) –

Các vấn đề liên quan