2009-04-07 17 views
7

Pomyślałem, że powinno być to proste rozwiązanie, zważywszy, że Rails 2.3 ma tę nowo sfałdowaną funkcję formularzy zagnieżdżonych. Zasadniczo chcę utworzyć lub zaktualizować użytkownika i przypisać mu role w tym samym czasie.Obiekt zagnieżdżony w/Checkboxes - przypisanie masy nawet z accepts_nested_attributes_for?

Wygląda na to, że wszystko robię dobrze, ale pojawia się błąd OSTRZEŻENIE: Nie można przypisać masowo tych chronionych atrybutów: roles_attrributes.

Próbowałem nawet zmienić widok na użytkownika [permissions_attrributes] [role_id], ponieważ pomyślałem, że może stół łączenia mylących Railsów.

W każdym razie, wszelkie sugestie, jak to powinno działać?

model

class User < ActiveRecord::Base 

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

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

Fragment widoku (zawiadomienie próbowałem i nie udało się dostać fields_for wygenerować co chcę tutaj, może to jest mój problem?)

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

Params napotykając wydają się być po prawej:

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

Rozwiązanie Kombinacja moich błędów pisowni, nie używających attr_accessible, potrzebujących dostępu do atrybutów uprawnień i nieznacznie wyłączonych formularzy.

Model:

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

Widok:

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

Odpowiedz

3

brzmi jak ten atrybut nie jest oznaczony jako bezpieczny dla aktualizacji. Powinieneś być w stanie go naprawić przez dodanie następujących do klasy modelu:

attr_accessible :roles 

lub ewentualnie:

attr_accessible :roles_attributes 

Jeśli spojrzeć, może masz już attr_accessible połączenia Można dodać do tego. Aby uzyskać więcej informacji, to jest udokumentowane tutaj:

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

+0

To było moje zrozumienie, że accepts_nested_attributes_for tego nie wymagało. Tak czy inaczej, próbowałem obu i nie działało. – Bill

+0

Ten komunikat o błędzie jest zdecydowanie taki, który byłby spowodowany przez problem attr_protected lub attr_accessible. Również http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for wskazuje, że jest to coś, o czym należy pamiętać nawet z ANAF. Być może warto się bliżej przyjrzeć? –

5

Jeśli popraw pisownię atrybutów w swojej , wygląda na to powinno działać.

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

Dobry połów! To by wyjaśniało, dlaczego atrybut nie został rozpoznany =) –

Powiązane problemy