2012-10-06 23 views
17

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?

Trả lời

19

Tôi tin rằng điều này là do CanCan sẽ sử dụng phương thức getter của riêng mình cho tài nguyên được yêu cầu nếu bạn không tải trước nó bằng before_filter. Vì vậy, bạn có thể thêm video này vào bộ điều khiển và nó cũng làm việc:

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

    load_and_authorize_resource 

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

(Và sau đó làm tương tự cho các hành động chỉnh sửa/cập nhật.)

+0

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? –

+6

Đã 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. –

+0

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! –

7
before_filter do 
    params[:user] = safe_params 
end 
load_and_authorize_resource 
+1

Sự nhấn mạnh chính ở đây trên ** before_filter ** đến trước ** load_and_authorize_resource ** – Ger

Các vấn đề liên quan