1

我正在尝试向我的 rails 3 应用程序添加设计授权。一切顺利,除了我也尝试按照教程为角色 ID 动态设置 attr_accessible 仅适用于管理员用户(我不希望普通用户更改他们的角色,但管理员应该能够这样做)......问题是, railscast 教程方法假设我有权更改控制器行为,而实际上设计正在处理所有这些。

请帮忙

4

2 回答 2

1

您可以对 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/.

于 2011-02-21T19:50:02.203 回答
0

我发现处理这个问题的最好方法是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
于 2012-08-20T01:08:09.347 回答