首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CanCan load_and_authorize_resource触发禁用属性

CanCan load_and_authorize_resource触发禁用属性
EN

Stack Overflow用户
提问于 2012-10-06 11:34:06
回答 2查看 6.1K关注 0票数 17

我有一个使用强参数的标准RESTful控制器。

代码语言:javascript
代码运行次数:0
运行
复制
class UsersController < ApplicationController
  respond_to :html, :js

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def edit
    @user = User.find(params[:id])
  end

  def create
    @user = User.new(safe_params)

    if @user.save
      redirect_to @user, notice: t('users.controller.create.success')
    else
      render :new
    end
  end

  def update
    @user = User.find(params[:id])

    if @user.update_attributes(safe_params)
      redirect_to @user, notice: t('users.controller.update.success')
    else
      render :edit
    end
  end

  def destroy
    @user = User.find(params[:id])

    if current_user != @user
      @user.destroy
    else
      flash[:error] = t('users.controller.destroy.prevent_self_destroy')
    end
    redirect_to users_url
  end

  private

  def safe_params
    safe_attributes =
      [
        :first_name,
        :last_name,
        :email,
        :password,
        :password_confirmation,
      ]
    if current_user.is?(:admin)
      safe_attributes += [:role_ids]
    end
    params.require(:user).permit(*safe_attributes)
  end
end

在我的config/initializers中有文件strong_parameters.rb

代码语言:javascript
代码运行次数:0
运行
复制
ActiveRecord::Base.send(:include,  ActiveModel::ForbiddenAttributesProtection)

当我向CanCan的load_and_authorize_resource添加一个简单的调用时,我得到

代码语言:javascript
代码运行次数:0
运行
复制
1) UsersController POST create with invalid params re-renders the 'new' template
 Failure/Error: post :create, user: @attr
 ActiveModel::ForbiddenAttributes:
   ActiveModel::ForbiddenAttributes
 # ./spec/controllers/users_controller_spec.rb:128:in `block (4 levels) in <top (required)>'

其中测试中的@attr定义为

代码语言:javascript
代码运行次数:0
运行
复制
  before(:each) do
    @attr =
      {
        first_name: "John",
        last_name: "Doe",
        email: "user@example.com",
        password: "foobar",
        password_confirmation: "foobar"
      }
  end

在测试中,我正确地设置了登录用户并为他们提供作为管理员所需的角色,所以我知道不是这样的。我不知道为什么这会导致ForbiddenAttributes触发。我敢肯定这是我忽略的一些简单的东西。有没有其他人遇到过这个问题并找到了解决方案?

EN

回答 2

Stack Overflow用户

发布于 2012-10-06 11:39:08

我相信这是因为如果您不使用before_filter预加载资源,CanCan将对所请求的资源使用自己的getter方法。因此,您可以将此代码添加到控制器中,它应该可以工作:

代码语言:javascript
代码运行次数:0
运行
复制
class UsersController < ApplicationController
  before_filter :new_user, :only => [:new, :create]

  load_and_authorize_resource

  def new_user
    @user = User.new(safe_params)
  end
end

(然后对编辑/更新操作执行相同的操作。)

票数 20
EN

Stack Overflow用户

发布于 2013-05-09 14:30:31

代码语言:javascript
代码运行次数:0
运行
复制
before_filter do
  params[:user] = safe_params
end
load_and_authorize_resource
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12756469

复制
相关文章

相似问题

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