2012-10-06 13 views
17

मेरे पास एक मानक रीस्टफुल नियंत्रक है जो मजबूत पैरामीटर का उपयोग करता है।कैनकन load_and_authorize_resource ट्रिगर किए गए गुण

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 में मैं जब मैं कैनकैन के load_and_authorize_resource के लिए एक सरल कॉल जोड़ने फ़ाइल strong_parameters.rb

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

है मैं

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 

परीक्षणों में मेरे पास उपयोगकर्ता को लॉगिन करने के लिए सभी सेटअप ठीक से हैं और उन्हें व्यवस्थापक होने के लिए आवश्यक भूमिकाएं दें, इसलिए मुझे पता है कि यह ऐसा नहीं है। मुझे नहीं पता कि यह क्यों फॉरबिडन एट्रिब्यूट ट्रिगर करने का कारण बन रहा है। मुझे यकीन है कि यह कुछ आसान है जिसे मैंने अनदेखा कर दिया है। क्या किसी और को इस समस्या का सामना करना पड़ा है और इसका समाधान मिला है?

उत्तर

19

मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि यदि आप पहले_फिल्टर से प्री-लोड नहीं करते हैं तो कैनकन अनुरोधित संसाधन के लिए अपनी खुद की गेटर विधि का उपयोग करेगा। तो तुम नियंत्रक को यह जोड़ सकते हैं और यह काम करना चाहिए:

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

    load_and_authorize_resource 

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

(और फिर संपादित करें/अद्यतन कार्यों के लिए भी ऐसा ही।)

+0

मेरा मानना ​​है कि मैं एक ही मुद्दा हो रहा है। क्या आप अपने समाधान को और स्पष्ट करने के बारे में सोचेंगे? –

+6

यह थोड़ी देर हो गया है लेकिन मैं इसे एक शॉट दूंगा;) आपको कौन सा हिस्सा परेशानी दे रहा है? असल में यदि आप कैनकन के 'load_and_authorize_resource' को कॉल करते हैं तो यह नियंत्रक के नाम को दिए गए सबसे अधिक "लॉजिकल" संसाधन को लोड करने का प्रयास करेगा, जो मजबूत पैरामीटर मणि के संचालन से पहले है। इस मामले में यह उपयोगकर्ता, '@user = user.new (पैराम्स [: उपयोगकर्ता]) बनाने का प्रयास करेगा, लेकिन मजबूत_परमीटर इस तरह बड़े पैमाने पर असाइनमेंट की अनुमति नहीं देंगे। यदि आप @user instance variable को सेट करने के लिए 'first_filter' का उपयोग करते हैं, तो कैनकन इसके बजाय इसका उपयोग करेगा। यदि आपका 'first_filter' strong_parameters का अनुपालन करता है तो उसे कोई त्रुटि नहीं उठानी चाहिए। –

+0

अहह बहुत सराहना की! मैं समझ नहीं रहा था कि कैसे कैनकन "... [अपने] गेटटर विधि का उपयोग कर रहा था ..." लेकिन इससे अब बहुत समझदारी आती है। एक बार फिर धन्यवाद! –

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

** load_and_authorize_resource ** से पहले ** पहले_फिल्टर ** पर आने पर प्रमुख जोर ** – Ger

संबंधित मुद्दे