RoR

2012-02-27 8 views
8

में कैनकन में पैराम पास करना मेरे पास एक विधि के साथ नियंत्रक है;RoR

def show 

    if params[:format].eql?("pdf") 
    // do something 
    elsif params[:format].eql?("csv") 
    // do something 
    end 
end 

लेकिन मेरे पास विभिन्न भूमिकाओं वाले उपयोगकर्ता हैं। इसलिए मैं एक्सेस नियंत्रण प्रबंधित करने के लिए कैनकन का उपयोग करता हूं। अब मैं चाहता हूं कि एक्स भूमिका show नियंत्रक iff params[:format].eql?("csv")

मुझे लगता है कि यह ऐसा हो सकता है; can :show, resource if params[:format].eql?("csv")। तो मैं क्षमता.आरबी को पैरामीटर कैसे भेज सकता हूं?

कोई विचार?

धन्यवाद।

उत्तर

24

ApplicationController में जोड़ने के निम्नलिखित:

# CanCan - pass params in to Ability 
# https://github.com/ryanb/cancan/issues/133 
def current_ability 
    @current_ability ||= Ability.new(current_user, params) 
end 
+0

इस उत्तर के रूप में चिह्नित किया जाना चाहिए। धन्यवाद! –

+1

परफेक्ट - 4 रिक्त स्थान से इंडेंट किए जाने के अलावा: डी – Hendrik

1

can दो तर्क लेता है: पहली कार्रवाई है कि उपयोगकर्ता एक संसाधन पर प्रदर्शन करने के लिए कोशिश कर रहा है के प्रकार है, दूसरा संसाधन है (वर्ग के नाम या उदाहरण चर हो सकता है) ही । आप अपनी क्षमता को सही ढंग से स्थापित किया है, तो आप इस तरह कुछ करने के लिए सक्षम होना चाहिए:

def show 
    if params[:format].eql?("pdf") 
    // do something 
    elsif params[:format].eql?("csv") 
    if can? :read, resource 
     #do stuff 
    end 
    end 
end 

मत भूलना आप अपने उपयोगकर्ता किसी भी कैनकैन चेकों को चलाने से पहले प्रमाणीकृत है करना है। can? विधि केवल सत्य या गलत लौटाती है। मैं आमतौर पर क्षमताओं की जांच के लिए authorize! विधि का उपयोग करना पसंद करता हूं। can के विपरीत, यह CanCan::AccessDenied त्रुटि बढ़ जाएगा जो आप बचाव और प्रक्रियापूर्वक प्रक्रिया कर सकते हैं। कुछ पंक्तियों में:

#models/ability.rb 
class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 

    if user.role? :admin 
     can :manage, :all 
    elsif user.role? :hiring_manager 
     can [:read, :update], Post, user_id: user.id 
    end 
    end 
end 

#controllers/posts_controller.rb 
class PostsController < ApplicationController::Base 
    before_filter :authenticate_user 

    def show 
    @post = Post.find(params[:id]) 
    authorize! :read, @post # will thorow an exception if not allowed 
    end 
end 

फिर, मैं केवल एप्लिकेशन नियंत्रक स्तर पर अपवाद पकड़ता हूं।

+0

अच्छी तरह से अच्छा उदाहरण साइमन लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं। क्योंकि मैं विधि के व्यवहार का निर्णय लेने के लिए पैरा [: प्रारूप] का उपयोग करता हूं। आपके उदाहरण में आप रिकॉर्ड खोजने के लिए पैरा का उपयोग करते हैं। अभिगम नियंत्रण का निर्णय लेने की क्षमता के लिए रिकॉर्ड पासस। लेकिन मैं आपके रास्ते में पैरा का उपयोग नहीं कर रहा हूँ। –

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

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