2009-08-24 8 views
6

मेरे आवेदन में, मेरे पास "उपयोगकर्ता" मॉडल है।एक नियंत्रक, सामान्य उपयोगकर्ताओं के लिए अलग-अलग विचार और व्यवस्थापक

Class User < ActiveRecord::Base 
    has_many :addresses 


    def is_authorized(op) 
    # returns true or false 
    end 

    def is_owned_by(user) 
    # returns true or false 
    end 
end 

Class Address < ActiveRecord::Base 
    belongs_to :user 
end 

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

यह सब अच्छी तरह से काम करता है और डेटाबेस अपडेट अपेक्षित के रूप में किए जाते हैं, हालांकि, मैं वास्तव में ऑपरेशन मोड के आधार पर अलग-अलग HTML दृश्य देखना चाहता हूं। मैं केवल कि प्राप्त करने के लिए दो तरीके के बारे में सोच सकते हैं:

  1. आपरेशन के मोड बनाओ (सामान्य/विशेषाधिकार प्राप्त) AddressController कक्षा में जाना जाता है (एक उदाहरण चर का उपयोग कर, जैसे @privileged) और में एक "अगर" बयान का उपयोग दृश्य
  2. एक अलग लेआउट प्रस्तुत करने के लिए पता नियंत्रक में "after_filter" जैसा कुछ उपयोग करें।

यदि ऑपरेशन के तरीके के आधार पर दो पूरी तरह से अलग लेआउट में एक नियंत्रक को निष्पादित करने के परिणाम प्रदर्शित करना संभव है, तो इसे प्राप्त करने का एक अच्छा तरीका क्या है?

अग्रिम स्टीफन

उत्तर

9

आप निर्दिष्ट कर सकते हैं कि कार्रवाई में कार्रवाई के परिणाम को प्रदर्शित करने के लिए किस दृश्य का उपयोग करना है। आप यह भी निर्दिष्ट कर सकते हैं कि कौन से लेआउट का उपयोग करना है। तो, उदाहरण के लिए:

def my_action 
    if @user.is_authorised(...) 
    render :action => 'admin_action', :layout => 'admin' 
    else 
    render :action => 'non_admin_action', :layout => 'non_admin' 
    end 
end 

यह या तो admin_action.html.erb या non_admin_action.html.erbis_authorised से लौटे मूल्य के आधार पर प्रस्तुत करना होगा। :layout विकल्प, er, वैकल्पिक है और दृश्य/लेआउट में एक लेआउट को संदर्भित करता है। रेंडर कॉल के कई अन्य विकल्प हैं जिन्हें आप documentation for render में पा सकते हैं।

+0

धन्यवाद। लेकिन ऐसा लगता है कि अगर मैं ऐसा करता हूं, तो मैं "कॉन्फ़िगरेशन पर सम्मेलन" का मार्ग छोड़ दूंगा। मैं थोड़ा चिंतित हूं - यह मेरा पहला रेल एप्लिकेशन है - क्या मुझे पहले से ही क्या करना है, सब कुछ क्या करना चाहिए? – cite

+0

खैर, तर्कसंगत सम्मेलन एक कार्रवाई के लिए एक दृश्य प्रस्तुत करना है, लेकिन मैं देख सकता हूं कि आप क्या प्राप्त कर रहे हैं। यदि आप केवल अलग-अलग लेआउट की तलाश में हैं तो स्टाइलन का समाधान एक अच्छा है। यदि आप वास्तव में कार्रवाई में तर्क के आधार पर अलग-अलग विचार प्रस्तुत करना चाहते हैं तो मुझे यकीन नहीं है कि यह स्पष्ट करने के लिए कि आप किस दृश्य को प्रस्तुत करना चाहते हैं, उसे दूर करने के लिए मूल सम्मेलन के करीब पर्याप्त है। – Shadwell

+0

मुझे लगता है कि मैं लेआउट के लिए स्टाइलन के समाधान का प्रयास करूंगा और टेम्पलेट के लिए आपका एक प्रस्तुत किया जाएगा। एक बार फिर धन्यवाद। – cite

3

धन्यवाद आप बस अपनी नियंत्रक एक्शन के अंत में मैन्युअल render विधि कॉल कर सकते हैं:

if @privileged 
    render :action => 'show_privileged' 
else 
    render :action => 'show' 
end 

यह app/views/myview/show_privileged.html.erb या app/views/myview/show.html.erb प्रस्तुत करना होगा। वैकल्पिक रूप से, आप रेंडर विधि में एक स्पष्ट टेम्पलेट फ़ाइल देने के लिए :template विकल्प का उपयोग कर सकते हैं।

+0

धन्यवाद, डेव। – cite

6

आप उस विशेष नियंत्रक, या द्वारा आवेदन नियंत्रक में पूरे आवेदन के लिए देखने के लेआउट निर्दिष्ट कर सकते हैं: 2.2.12 के तहत http://guides.rubyonrails.org/layouts_and_rendering.html#using-render,:

class SomeController < ApplicationController 
    layout :set_layout 

    def set_layout 
    @user.is_authorized(...) ? "privileged_layout" : "normal_layout" 
    end 

    ... 
end 

आप यहाँ यह पता लगाने की कोशिश कर सकते हैं लेआउट ढूँढना

आशा इस = मदद करता है)

+0

ओह, यह एक अच्छा विचार है। आपका बहुत बहुत धन्यवाद! – cite

2

इस आपके एप्लिकेशन में केवल नियंत्रक जहां अगर कर रहे हैं/सब जगह है कि शायद ठीक है अधिक else'ing है। यदि आप हर जगह इस प्रकार के तर्क को शुरू करना शुरू करते हैं जो आपको बताएगा कि आप एक बार में बहुत अधिक कर रहे हैं।

आपके द्वारा स्वीकार किया गया उत्तर (जो ठीक है और काम करता है!) में एक अलग लेआउट और एक अलग दृश्य है, जो कहता है कि नियंत्रक बहुत अधिक कर रहा है - मैं इसे एक व्यवस्थापक नियंत्रक में विभाजित कर दूंगा।

+0

यह। तुम सही थे। मैंने एक ही समय में बहुत सी चीजों को करने की कोशिश की - ऑपरेशन के दो तरीकों में उन सभी कार्यों को आराम से उपलब्ध कराने का विचार बहुत दिलचस्प था। मैंने एक समर्पित व्यवस्थापक नियंत्रक लिखा था। धन्यवाद। – cite

0

आपको प्रशासनिक कार्यों को एक प्रशासनिक नेमस्पेस में रखना चाहिए और उसे वहां प्रतिबंधित करना चाहिए। अपने नियंत्रकों निर्देशिका में नाम वाली निर्देशिका admin बनाएँ और वहाँ में एक _application_controller.rb_ जोड़ें:

class Admin::ApplicationController < ApplicationController 
    before_filter :check_authorized 

    private 
    def check_authorized? 
     if !logged_in? || !current_user.admin? 
     flash[:notice] = "You've been very bad. Go away. 
     redirect_to root_path 
     end 
    end 
end 

अब आप इस नेम स्पेस में नियंत्रकों डाल दिया और उन्हें भी Admin::ApplicationController से विरासत बना सकते हैं।

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

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