Tôi có bộ điều khiển RESTful chuẩn sử dụng thông số mạnh.CanCan load_and_authorize_resource triggers Thuộc tính bị cấm
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
Trong config/initializers
của tôi, tôi có tập tin strong_parameters.rb
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
Khi tôi thêm một cuộc gọi đơn giản để load_and_authorize_resource
Cancan của tôi nhận được
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)>'
đâu @attr
trong các thử nghiệm được định nghĩa là
before(:each) do
@attr =
{
first_name: "John",
last_name: "Doe",
email: "[email protected]",
password: "foobar",
password_confirmation: "foobar"
}
end
Trong các bài kiểm tra tôi có tất cả thiết lập đúng cách để đăng nhập người dùng và cung cấp cho họ vai trò cần thiết để trở thành quản trị viên, vì vậy tôi biết không phải vậy. Tôi không biết tại sao điều này gây ra ForbiddenAttributes để kích hoạt. Tôi chắc chắn nó là một cái gì đó đơn giản tôi đã bỏ qua. Có ai khác gặp phải vấn đề này và tìm ra giải pháp cho nó không?
Tôi tin rằng tôi đang gặp vấn đề tương tự. Bạn có nhớ làm rõ giải pháp của bạn hơn nữa không? –
Đã lâu rồi nhưng tôi sẽ quay lại;) Phần nào khiến bạn gặp rắc rối? Về cơ bản, nếu bạn gọi 'load_and_authorize_resource' của cancan, nó sẽ cố tải tài nguyên" logic "nhất cho tên của bộ điều khiển, trước tên hoạt động của gem tham số mạnh. Trong trường hợp này, nó sẽ cố gắng xây dựng User, '@user = User.new (params [: user])' Nhưng strong_parameters sẽ không cho phép gán hàng loạt theo cách này. Nếu bạn sử dụng 'before_filter' để đặt biến cá thể @user, CanCan sẽ chỉ sử dụng nó thay vào đó. Nếu 'before_filter' của bạn tuân thủ strong_parameters thì nó sẽ không gây ra lỗi. –
Ahhh Được đánh giá cao! Tôi đã không hiểu CanCan là "... [sử dụng] phương pháp getter riêng của mình ..." nhưng điều đó có ý nghĩa rất nhiều bây giờ. Cảm ơn một lần nữa! –