保存has_and_belongs_to_many孩子

时间:2009-03-28 13:12:41

标签: ruby-on-rails ruby has-and-belongs-to-many

我有一个用户模型和一个角色模型。它们通过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"

我希望通过在我的create选项中调用@ user.save将Role保存到用户。那可能吗?或者这是一种我不能以这种方式使用的关系,它是否需要一个has_many关系让我能够做到这一点。

5 个答案:

答案 0 :(得分:2)

我认为您需要在模型中要保存的属性上调用attr_accessible,以避免质量分配错误。

答案 1 :(得分:1)

您不能将accepts_nested_attributes_for用于habtm关系。

您可以设置role_ids,有关详细信息,请参阅Railscast第17集

在你的情况下,问题是你只设置一个角色但是有habtm关系,为什么不是belongs_to?

答案 2 :(得分:0)

您使用的是新的accepts_nested_attributes_for方法吗?

它可能看起来像这样:

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

Check out this sample app for more detail.

答案 3 :(得分:0)

考虑到问题被问到的时间,你可能已经自己解决了这个问题......

  

事情是,我得到了一个   警告我无法批量分配   角色关系。

这是由用户模型中的两件事之一引起的。

  1. 您调用了attr_accessible,并且提供的符号列表不包括:roles
  2. 您调用了attr_protected,符号列表包括:roles
  3. 在attr_accessible调用中添加:roles或从attr_protected调用中删除它。

答案 4 :(得分:0)

如果我可以编辑/添加答案,我会。我有类似@EmFi提到的类似内容。我有attr_accessible设置,并且必须添加等效的

:role_ids

到用户模型的attr_accessible。注意复数。以下选项工作:

  • :作用
  • :角色
  • :ROLE_ID

要清楚我收到的错误消息:

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

这个警告对我来说没有多大意义,因为我正在使用habtm关系。不过,这是正确的。