Сохранить has_and_belongs_to_many ребенка - PullRequest
1 голос
/ 28 марта 2009

У меня есть модель пользователя и ролевая модель. К ним присоединяются отношения has_and_belongs_to_many. Когда администратор создает пользователя, я хочу, чтобы он мог назначать ему роль и сохранять его при вызове @ user.save

Дело в том, что я получаю предупреждение, что не могу массово назначить отношения ролей.

Любые предложения о том, как это сделать, я на Rails 2.3.2

Спасибо.

Редактировать: Код по запросу.

user.rb

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles,
                          :join_table => "users_roles",
                          :foreign_key => "role_id",
                          :associated_foreign_key => "user_id"
end

role.rb

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users,
                          :join_table => "users_roles", 
                          :foreign_key => "user_id", 
                          :association_foreign_key => "role_id"
end

Просмотр: new.html.haml

- form_for(@user, users_path(:subdomain => current_account.subdomain)) do |f|
  .input_set
    = f.label(:login, "Username")
    = f.text_field(:login)
  .input_set
    = f.label(:name)
    = f.text_field(:name)
  .input_set
    = f.label(:email)
    = f.text_field(:email)
    - fields_for("user[roles][]", Role)do |user_role|
      .input_set
        %label Role
        = user_role.select(:name, Role.all.map{|r| [r.name, r.id] })
  .input_set
    = f.label(:password)
    = f.password_field(:password)
  .input_set
    = f.label(:password_confirmation, "Password Again")
    = f.password_field(:password_confirmation)
  .input_set
    %label
    = f.submit "Add User"

И я хочу, чтобы Роль сохранялась для пользователя, вызывая @ user.save в моей опции создания. Это возможно? Или это отношения, которые я не могу использовать таким образом, для этого мне нужны отношения has_many.

Ответы [ 5 ]

2 голосов
/ 14 апреля 2009

Я полагаю, что вам нужно вызвать attr_accessible для атрибутов в модели, которую вы хотите сохранить, чтобы избежать ошибки массового назначения.

1 голос
/ 10 июня 2009

Вы не можете использовать acceptpts_nested_attributes_for для отношения habtm.

Однако вы можете установить role_ids, подробности см. В эпизоде ​​Railscast 17

В вашем случае проблема в том, что вы устанавливаете только одну роль, но у вас есть отношения habtm, почему бы не принадлежать_

0 голосов
/ 26 января 2010

Если бы я мог редактировать / добавить к ответу, я бы. У меня было нечто похожее на то, что упомянул @EmFi. Я установил attr_accessible, и мне пришлось добавить эквивалент

:role_ids

в attr_accessible пользовательской модели. Обратите внимание на множественное число. Следующие опции не работали:

  • : роль
  • : роли
  • : role_id

Просто чтобы прояснить сообщение об ошибке, которое я получил:

WARNING: Can't mass-assign these protected attributes: role_ids

Предупреждение не имело для меня большого смысла, так как я использую отношения habtm. Тем не менее, это было правильно.

0 голосов
/ 26 октября 2009

Учитывая время, прошедшее после того, как вопрос был задан, вы, вероятно, решили это самостоятельно ...

Дело в том, что я получаю предупреждение о том, что я не могу назначить Ролевые отношения.

Это вызвано одной из двух вещей в вашей пользовательской модели.

  1. Вы вызвали attr_accessible, и список предоставленных символов не включает: роли
  2. Вы вызвали attr_protected, и список символов включает в себя: role

Либо добавьте: role в ваш вызов attr_accessible, либо удалите его из вызова attr_protected.

0 голосов
/ 29 марта 2009

Используете ли вы новый accepts_nested_attributes_for метод?

Вероятно, это будет выглядеть примерно так:

class User < ActiveRecord::Base 
  accepts_nested_attributes_for :roles, :allow_destroy => true
end

Проверьте этот пример приложения для более подробной информации.

...