1

我有一个用户模型和一个角色模型。它们由 has_and_belongs_to_many 关系连接。当管理员创建用户时,我希望他们能够为用户分配角色并在我调用 @user.save 时将其保存

但问题是我收到一个警告,说我无法批量分配角色关系。

关于如何去做的任何建议,我在 Rails 2.3.2

谢谢。

编辑:按要求编码。

用户.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

角色.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 关系才能做到这一点。

4

5 回答 5

2

我相信您需要对要保存的模型中的属性调用 attr_accessible 以避免批量分配错误。

于 2009-04-14T04:48:52.760 回答
1

您不能将accepts_nested_attributes_for 用于habtm 关系。

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

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

于 2009-06-10T17:37:09.970 回答
0

考虑到自提出问题以来的时间,您可能已经自己解决了这个问题......

但问题是我收到一个警告,说我无法批量分配角色关系。

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

  1. 您调用了 attr_accessible 并且提供的符号列表不包括 :roles
  2. 您调用了 attr_protected 并且符号列表包括 :roles

将 :roles 添加到您的 attr_accessible 调用或将其从 attr_protected 调用中删除。

于 2009-10-26T06:05:35.880 回答
0

您是否使用新的accepts_nested_attributes_for方法?

它可能看起来像这样:

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

查看此示例应用程序以获取更多详细信息。

于 2009-03-28T22:27:24.900 回答
0

如果我可以编辑/添加到答案,我会的。我需要与@EmFi 提到的类似的东西。我设置了 attr_accessible ,并且必须添加相当于

:role_ids

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

  • :角色
  • :角色
  • :role_id

只是为了清楚我收到的错误消息:

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

由于我使用的是 habtm 关系,因此该警告对我来说没有多大意义。尽管如此,它是正确的。

于 2010-01-26T05:39:32.420 回答