Вложенный объект с флажками - массовое назначение даже с acceptpts_nested_attributes_for? - PullRequest
7 голосов
/ 07 апреля 2009

Я подумал, что должно быть простое решение, учитывая, что в Rails 2.3 есть эта новая функция вложенных форм. По сути, я хочу создать или обновить пользователя и назначить ему роли одновременно.

Кажется, что я все делаю правильно, но я получаю ошибку ВНИМАНИЕ: Не удается назначить массово эти защищенные атрибуты: role_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 %>

Параметры, которые встречаются, кажутся правильными:

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

Ответы [ 2 ]

5 голосов
/ 08 апреля 2009

Если вы исправите написание атрибутов в вашем check_box_tag, похоже, оно должно работать.

<% for role in Role.all %>
 <%= check_box_tag( "user[roles_attributes][id]",role.id) %>
 <%= role.rolename %>
 <br/>
<% end %>
3 голосов
/ 08 апреля 2009

похоже, что этот атрибут не помечен как безопасный для обновления. Вы сможете исправить это, добавив в свой класс модели следующее:

attr_accessible :roles

или, возможно:

attr_accessible :roles_attributes

Если вы посмотрите, возможно, у вас уже есть вызов attr_accessible, к которому вы можете добавить это. Для получения дополнительной информации это задокументировано здесь:

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

...