CanCan load_and_authorize_resource löst verbotene Attribute aus
Ich habe einen Standard-RESTful-Controller, der starke Parameter verwendet.
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
In meinemconfig/initializers
Ich habe die Aktestrong_parameters.rb
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
Wenn ich CanCan's einen einfachen Anruf hinzufügeload_and_authorize_resource
Ich bekomme
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)>'
Woher@attr
im Test ist definiert als
before(:each) do
@attr =
{
first_name: "John",
last_name: "Doe",
email: "[email protected]",
password: "foobar",
password_confirmation: "foobar"
}
end
In den Tests habe ich alles richtig eingerichtet, um den Benutzer anzumelden und ihm die erforderlichen Rollen als Administrator zuzuweisen, damit ich weiß, dass dies nicht der Fall ist. Ich weiß nicht, warum dies dazu führt, dass ForbiddenAttributes ausgelöst wird. Ich bin sicher, es ist etwas Einfaches, das ich übersehen habe. Hat jemand anderes auf dieses Problem gestoßen und eine Lösung dafür gefunden?