我正在尝试向我的 rails 3 应用程序添加设计授权。一切顺利,除了我也尝试按照本教程为角色 ID 动态设置 attr_accessible 仅适用于管理员用户(我不希望普通用户更改他们的角色,但管理员应该能够这样做)......问题是, railscast 教程方法假设我有权更改控制器行为,而实际上设计正在处理所有这些。
请帮忙
我正在尝试向我的 rails 3 应用程序添加设计授权。一切顺利,除了我也尝试按照本教程为角色 ID 动态设置 attr_accessible 仅适用于管理员用户(我不希望普通用户更改他们的角色,但管理员应该能够这样做)......问题是, railscast 教程方法假设我有权更改控制器行为,而实际上设计正在处理所有这些。
请帮忙
您可以对 Devise 控制器进行子类化,您只需生成视图并将它们移动到正确的位置。查看设计自述文件中的“配置视图”和“配置控制器”。
我最终将 role_ids 添加到 attr_accessible,然后将 RegistrationsController 子类化并添加一个 before_filter 以删除非管理员的该参数。
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :remove_admin_params, :only => [:create, :update]
protected
# disable setting the role_ids value unless an admin is doing the edit.
def remove_admin_params
params[:user].delete(:role_ids) unless current_user.try(:admin?)
end
end
只需确保将注册视图添加到/app/views/users/registrations/
.
我发现处理这个问题的最好方法是RailsCast 237。它比 Arrel 的答案更详细,但它不会强制您将角色(或其他字段)添加到 attr_accessible。
在初始化程序中添加以下方法:
class ActiveRecord::Base
attr_accessible
attr_accessor :accessible
private
def mass_assignment_authorizer(role = :default)
if accessible == :all
self.class.protected_attributes # hack
else
# super returns a whitelist object
super + (accessible || [])
end
end
end
然后在您的控制器中,您可以执行以下操作:
user.accessible = :role 如果可以的话?:set_role, 资源
不幸的是,这个调用必须在用户(或其他)对象被实例化之后进行。这意味着您必须对控制器进行子类化,并在更新和创建中的资源实例化之后调用它。
这适用于 Rails 3.2。在早期版本中,我相信方法 mass_assignment_authorizer 不带参数。没有值的 attr_accessible 设置故障安全应用程序范围的批量分配拒绝。这也可以在 application.rb 文件中完成
config.active_record.whitelist_attributes = true