Rails 3.1 attr_accessible 验证接收角色数组

Posted

技术标签:

【中文标题】Rails 3.1 attr_accessible 验证接收角色数组【英文标题】:Rails 3.1 attr_accessible verification receives an array of roles 【发布时间】:2011-11-22 08:34:53 【问题描述】:

我想使用 rails 新的动态 attr_accessible 功能。但是,我的每个用户都有许多角色(我正在使用声明式授权)。所以我的模型中有以下内容:

class Student < ActiveRecord::Base

attr_accessible :first_name, :as=> :admin

end

然后我在我的控制器中传递这个:

@student.update_attributes(params[:student], :as => user_roles)

user_roles 是一个符号数组:

   user_roles = [:admin, :employee]

我希望我的模型检查数组中的某个符号是否与声明的 attr_accessible 匹配。因此,我避免任何重复。

例如,假设 user_roles =[:admin, :employee]。这有效:

@student.update_attributes(params[:student], :as => user_roles.first)

但是如果我只能验证一个角色或符号是没有用的,因为我的所有用户都有很多角色。

任何帮助将不胜感激

***************更新******** *************** *

您可以在此处下载示例应用程序: https://github.com/jalagrange/roles_test_app

此应用中有 2 个示例: y 无法更新任何属性的学生,尽管事实上 'user_roles = [:admin, :student]';而我只能更改名字的人,因为我在控制器更新操作中使用“user_roles.first”。希望这可以帮助。我确定其他人一定有这个问题。

【问题讨论】:

谁可能是 :admin 或 :student?我想必须先为用户分配一个角色(作为:admin 或:student),然后才能验证其角色是否正确。 是的,完全正确。首先为用户分配一个角色。我个人使用“声明式授权”。因此,我的所有用户都有与他们相关的特定角色。这是因为声明式授权有一个名为“role_symbols”的方法,它返回一个符号数组,就像上面示例中的“user_roles”一样。 【参考方案1】:

您可以按如下方式对ActiveModel's mass assignment module 进行猴子补丁:

# in config/initializers/mass_assignment_security.rb

module ActiveModel::MassAssignmentSecurity::ClassMethods

  def accessible_attributes(roles = :default)
    whitelist = ActiveModel::MassAssignmentSecurity::WhiteList.new
    Array.wrap(roles).inject(whitelist) do |allowed_attrs, role|
      allowed_attrs + accessible_attributes_configs[role].to_a
    end
  end

end

这样,您可以将数组作为:as 选项传递给update_attributes

请注意,如果accessible_attrs_configs 包含BlackList(来自使用attr_protected),这可能会中断

【讨论】:

好的,这可以工作。我应该在哪里做这个?在新的模型文件中?在配置中?谢谢 @jalagrange 您可以将其放在 config/initializers 中的文件中。它将在 rails 启动时加载。文件名并不重要。 您好@axelarge,我刚刚尝试过,但它不起作用:-(。我完全按照我的问题中所述进行操作:传递包含符号数组的“:as => user_roles”:user_roles = [:admin, :employee]。还有其他建议吗? @jalagrange 这很奇怪,我设置了一个示例应用程序,它对我有用。也许您可以在gist.github.com 或类似的地方发布您的模型和控制器的相关部分? 对不起@axelarge,过去几周我一直不在,谢谢你的帮助,我会在几个小时内发布我的代码。也许您也可以发布您的示例应用程序。我会告诉你什么时候准备好

以上是关于Rails 3.1 attr_accessible 验证接收角色数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 4 中如何使用 attr_accessible?

用于 attr_accessible/protected 的 Rails 3 配置设置

Rails - attr_accessible & mass assignment

Rails 批量赋值定义和 attr_accessible 使用

在模型 Rails 3.2.2 中没有设置 attr_accessible 的质量分配

Rails 3.2,批量分配,动态角色?