首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails设计attr_accessible问题

Rails设计attr_accessible问题
EN

Stack Overflow用户
提问于 2011-01-31 08:27:41
回答 2查看 1.6K关注 0票数 1

我正在尝试为我的rails 3应用程序添加devise授权。一切顺利,除了我也试图遵循this教程,为管理员用户动态设置role_ids的attr_accessible (我不希望普通用户改变他们的角色,但管理员应该能够这样做)…问题是,railscast教程方法假设我有权更改控制器行为,而实际上devise正在幕后处理所有这些。

请帮帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 03:50:02

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

我最终将role_ids添加到attr_accessible中,然后对RegistrationsController进行子类化,并添加一个before_filter来删除非管理员的该参数。

代码语言:javascript
复制
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/即可。

票数 1
EN

Stack Overflow用户

发布于 2012-08-20 09:08:09

我发现处理这个问题的最好方法是来自RailsCast 237。它比Arrel的答案更冗长,但它不会强制您向attr_accessible添加角色(或其他字段)。

在初始化器中添加以下方法:

代码语言:javascript
复制
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文件中使用以下命令完成此操作

代码语言:javascript
复制
config.active_record.whitelist_attributes = true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4846626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档