我正在尝试为我的rails 3应用程序添加devise授权。一切顺利,除了我也试图遵循this教程,为管理员用户动态设置role_ids的attr_accessible (我不希望普通用户改变他们的角色,但管理员应该能够这样做)…问题是,railscast教程方法假设我有权更改控制器行为,而实际上devise正在幕后处理所有这些。
请帮帮忙
发布于 2011-02-22 03:50:02
您可以将Devise控制器子类化,只需生成视图并将其移动到正确的位置即可。查看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/即可。
发布于 2012-08-20 09:08:09
我发现处理这个问题的最好方法是来自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 =:角色?:set_role,资源
不幸的是,这个调用必须在实例化user (或其他)对象之后进行。这意味着您必须继承控制器的子类,并在更新和创建中的资源实例化之后调用它。
这是针对Rails 3.2的。在早期版本中,我相信mass_assignment_authorizer方法不带参数。不带任何值的attr_accessible为批量赋值设置了故障保护应用程序范围的拒绝。也可以在application.rb文件中使用以下命令完成此操作
config.active_record.whitelist_attributes = truehttps://stackoverflow.com/questions/4846626
复制相似问题