2011-11-18 14 views
16

के साथ ढूंढें मैं उपयोगकर्ता एथ के लिए डेविस के साथ रेल 3 का उपयोग कर रहा हूं। मान लें कि मेरे पास एक उपयोगकर्ता मॉडल है, डेविस सक्षम है, और एक उत्पाद मॉडल है, और उपयोगकर्ता के पास कई उत्पाद हैं।रेल के दायरे को वर्तमान उपयोगकर्ता

मेरे उत्पाद नियंत्रक में मैं अपने खोज विधि को current_user द्वारा स्कॉप्ड करना चाहता हूं, यानी।

@product = current_user.products.find(params[:id])

जब तक उपयोगकर्ता एक व्यवस्थापक उपयोगकर्ता है, यानी current_user.admin?

अभी, मैं लगभग हर विधि है, जो गन्दा लगता है कि कोड चल रहा हूँ:

if current_user.admin? 
    @product = Product.find(params[:id]) 
else 
    @product = current_user.products.find(params[:id]) 
end 

क्या ऐसा करने का एक और अधिक सुरुचिपूर्ण/मानक तरीका है?

उत्तर

5

आप अपने नियंत्रकों का एक बहुत में इस कोड को चला रहे हैं, तो आप शायद यह एक फिल्टर से पहले करना चाहिए, और है कि अपने ApplicationController में करने के लिए एक विधि को परिभाषित:

before_filter :set_product, :except => [:destroy, :index] 

def set_product 
    @product = current_user.admin? ? Product.find(params[:id]) : current_user.products.find(params[:id]) 
end 

मैं नहीं जानता यह निर्धारित करने के लिए आप क्या उपयोग करते हैं कि कोई उपयोगकर्ता व्यवस्थापक है या नहीं (भूमिकाएं), लेकिन यदि आप CanCan में देखते हैं, तो इसमें accessible_by स्कोप है जो एक क्षमता स्वीकार करता है (एक ऑब्जेक्ट जो उपयोगकर्ता नियंत्रित कर सकता है और नहीं कर सकता) और रिकॉर्ड देता है उस उपयोगकर्ता के पास आपके द्वारा लिखे गए अनुमतियों के आधार पर पहुंच है। शायद यह वास्तव में आप चाहते हैं कि आप चाहते हैं, लेकिन अपनी अनुमति प्रणाली को छीनना और इसे बदलना आपके लिए संभव हो सकता है या नहीं भी हो सकता है।

2

आप उपयोगकर्ता पर तर्क के रूप में भेजे गए उपयोगकर्ता के साथ एक क्लास विधि जोड़ सकते हैं।

class Product < ActiveRecord::Base 
    ... 

    def self.for_user(user) 
    user.admin? ? where({}) : where(:owner_id => user.id) 
    end 

तो फिर तुम इसे इस तरह कॉल कर सकते हैं:

Product.for_user(current_user).find(params[:id]) 

पुनश्च: वहाँ शायद where({}) करने के लिए एक बेहतर तरीका है।

+0

Product.scoped 1 = 1 – klochner

+0

@klochner सिवाय इसके कि जगह ले सकता है: आप अपने नियंत्रक में निम्नलिखित लिखने के

class Product scope :by_user, lambda { |user| where(:owner_id => user.id) unless user.admin? } end 

इस अनुमति देता है यह केवल तभी काम करेगा जब यह श्रृंखला में पहला कॉल है: (कार्य: 'Product.for_user (...) ', यह नहीं है:' Product.enabled.for_user (...) ') – mbillard

+0

mbillard - सच नहीं है, कोशिश करो – klochner

20

मैं यह करना चाहते प्रकार है:

Product.by_user(current_user).find(params[:id]) 
संबंधित मुद्दे