Подтвердить что ты не робот

CanCan load_and_authorize_resource триггеры Запрещенные атрибуты

У меня есть стандартный RESTful-контроллер, который использует сильные параметры.

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

ActiveRecord::Base.send(:include,  ActiveModel::ForbiddenAttributesProtection)

Когда я добавляю простой вызов CanCan load_and_authorize_resource, я получаю

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 в тесте определяется как

  before(:each) do
    @attr =
      {
        first_name: "John",
        last_name: "Doe",
        email: "[email protected]",
        password: "foobar",
        password_confirmation: "foobar"
      }
  end

В тестах я все правильно настроил для входа в систему пользователя и предоставления им необходимых ролей для администратора, поэтому я знаю, что это не так. Я не знаю, почему это вызывает ForbiddenAttributes для запуска. Я уверен, что это простое, что я забыл. Кто-нибудь еще столкнулся с этой проблемой и нашел для нее решение?

4b9b3361

Ответ 1

Я считаю, что это потому, что CanCan будет использовать собственный метод getter для запрошенного ресурса, если вы не предварительно загрузите его с помощью before_filter. Поэтому вы можете добавить это к контроллеру, и он должен работать:

class UsersController < ApplicationController
  before_filter :new_user, :only => [:new, :create]

  load_and_authorize_resource

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

(И затем сделайте то же самое для действий редактирования/обновления.)

Ответ 2

before_filter do
  params[:user] = safe_params
end
load_and_authorize_resource