Ruby on rails Rails设计了一个属性访问问题

Ruby on rails Rails设计了一个属性访问问题,ruby-on-rails,devise,attr-accessible,Ruby On Rails,Devise,Attr Accessible,我正在尝试将设计授权添加到我的rails 3应用程序中。 这一切都进行得很顺利,除了我还试图按照教程动态设置attr_accessible for role_id,只针对管理员用户(我不希望普通用户更改他们的角色,但管理员应该能够这样做)。。。问题是,railscast教程方法假设我有权更改控制器行为,而实际上Desive正在处理引擎盖下的所有内容 请帮助您可以对Desive控制器进行子类化,只需生成视图并将其移动到正确的位置即可。查看设备自述文件中的“配置视图”和“配置控制器” 最后,我将角色

我正在尝试将设计授权添加到我的rails 3应用程序中。 这一切都进行得很顺利,除了我还试图按照教程动态设置attr_accessible for role_id,只针对管理员用户(我不希望普通用户更改他们的角色,但管理员应该能够这样做)。。。问题是,railscast教程方法假设我有权更改控制器行为,而实际上Desive正在处理引擎盖下的所有内容


请帮助

您可以对Desive控制器进行子类化,只需生成视图并将其移动到正确的位置即可。查看设备自述文件中的“配置视图”和“配置控制器”

最后,我将角色ID添加到attr\u accessible,然后对RegistrationsController进行子类化,并添加before\u过滤器以删除非管理员的参数

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
类用户::注册控制器<设计::注册控制器
在\u筛选器之前:删除\u admin\u参数,:only=>[:创建,:更新]
受保护的
#除非管理员正在进行编辑,否则禁用设置角色ID值。
def删除管理参数
参数[:user]。删除(:角色\u ID),除非是当前用户。请尝试(:admin?)
结束
结束

只需确保将注册视图添加到
/app/views/users/registrations/

您可以对设备控制器进行子分类,只需生成视图并将其移动到正确的位置即可。查看设备自述文件中的“配置视图”和“配置控制器”

最后,我将角色ID添加到attr\u accessible,然后对RegistrationsController进行子类化,并添加before\u过滤器以删除非管理员的参数

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
类用户::注册控制器<设计::注册控制器
在\u筛选器之前:删除\u admin\u参数,:only=>[:创建,:更新]
受保护的
#除非管理员正在进行编辑,否则禁用设置角色ID值。
def删除管理参数
参数[:user]。删除(:角色\u ID),除非是当前用户。请尝试(:admin?)
结束
结束

只需确保将注册视图添加到
/app/views/users/registrations/

我发现处理此问题的最佳方法是从。这比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=:角色是否可以?:设置您的角色、资源

不幸的是,这个调用必须在用户(或任何对象)被实例化之后进行。这意味着您必须对控制器进行子类化,并在update和create中的资源实例化之后调用它

这是针对Rails 3.2的。在早期版本中,我相信mass_assignment_authorizer方法不带参数。attr_accessible with no Value(无值可访问)设置大规模分配的故障安全应用程序范围拒绝。也可以在application.rb文件中使用

config.active_record.whitelist_attributes = true

我发现处理这件事的最好方法是从。这比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=:角色是否可以?:设置您的角色、资源

不幸的是,这个调用必须在用户(或任何对象)被实例化之后进行。这意味着您必须对控制器进行子类化,并在update和create中的资源实例化之后调用它

这是针对Rails 3.2的。在早期版本中,我相信mass_assignment_authorizer方法不带参数。attr_accessible with no Value(无值可访问)设置大规模分配的故障安全应用程序范围拒绝。也可以在application.rb文件中使用

config.active_record.whitelist_attributes = true