Rails 3.1 attr_accessible 验证接收角色数组

发布于 2024-12-05 13:50:37 字数 1196 浏览 0 评论 0原文

我想使用 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)

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

任何帮助将不胜感激

***********< em>****更新************* ***********

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

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

I would like to use rails new dynamic attr_accessible feature. However each of my user has many roles (i am using declarative authorization). So i have the following in my model:

class Student < ActiveRecord::Base

attr_accessible :first_name, :as=> :admin

end

and i pass this in my controller:

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

user_roles is an array of symbols:

   user_roles = [:admin, :employee]

I would like my model to check if one of the symbols in the array matches with the declared attr_accessible. Therefore I avoid any duplication.

For example, given that user_roles =[:admin, :employee]. This works:

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

but it is useless if I can only verify one role or symbol because all my users have many roles.

Any help would be greatly appreciated

***************UPDATE************************

You can download an example app here:
https://github.com/jalagrange/roles_test_app

There are 2 examples in this app: Students in which y cannot update any attributes, despite the fact that 'user_roles = [:admin, :student]'; And People in which I can change only the first name because i am using "user_roles.first" in the controller update action. Hope this helps. Im sure somebody else must have this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哎呦我呸! 2024-12-12 13:50:37

您可以对 ActiveModel 的批量分配模块进行猴子补丁,如下所示:

# 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 包含黑名单(来自使用attr_protected

You can monkey-patch ActiveModel's mass assignment module as follows:

# 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

That way, you can pass an array as the :as option to update_attributes

Note that this probably breaks if accessible_attrs_configs contains a BlackList (from using attr_protected)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文