2011-03-31 18 views
18

रेलस्टोटोटर.org में एक सुझाव है जो मुझे थोड़ा अजीब के रूप में मारता है।Railstutorial.org में सत्र हेल्पर: क्या मददकर्ताओं को कोड में आवश्यक कोड के लिए सामान्य उद्देश्य मॉड्यूल होना चाहिए?

It suggests this code:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    include SessionsHelper 
end 

include SessionsHelper तरीकों ApplicationController से उपलब्ध है, हाँ बनाता है, लेकिन यह उन्हें किसी भी दृश्य में उपलब्ध है, साथ ही बनाता है। मैं समझता हूं कि प्रमाणीकरण/प्रमाणीकरण क्रॉस-कटिंग है, लेकिन क्या यह वास्तव में सबसे अच्छी जगह है?

ऐसा लगता है कि मुझे संभावित रूप से एक गुंजाइश का व्यापक रूप से व्यापक होना प्रतीत होता है। कोड लागू करना, कहें, before_filter जो मॉड्यूल में सशर्त रूप से रीडायरेक्ट करता है (जैसा कि Railstutorial.org उदाहरण करता है) जो आमतौर पर व्यू हेल्पर्स को आश्चर्यजनक लगता है।

क्या कार्यक्षमता में दृढ़ता से आवश्यक कार्यक्षमता अनुप्रयोग नियंत्रक या अन्य जगहों पर बेहतर नहीं होगी?

या क्या मैं बस इसके बारे में बहुत कुछ सोच रहा हूं?

उत्तर

19

दरअसल, आपकी भावना सही है।

मैं इस दूसरी तरह के आसपास लागू करना होगा: कार्यों sign_in और ApplicationController को current_user जोड़ने (या यदि आप वास्तव में चाहते हैं: एक अलग मॉड्यूल lib में परिभाषित में है और यह शामिल हैं), और उसके बाद यह सुनिश्चित करें कि current_user विधि है दृश्य में उपलब्ध है।

संक्षेप में:

class ApplicationController 

    helper_method :current_user 

    def sign_in 

    end 

    def current_user 
    @current_user ||= user_from_remember_token 
    end 
end 
बेशक

, यदि आप कोड का एक बहुत अपने ApplicationController में रखने की ज़रूरत यह गंदा मिल सकती है। उस मामले में मैं एक फ़ाइल lib\session_management.rb बनाना होगा:

module SessionManagement 
    def self.included(base) 
    base.helper_method :current_user 
    end 

    def sign_in 
    .. 
    end 

    def current_user 
    .. 
    end 
end 

और अपने नियंत्रक के अंदर आप तो बस लिख सकते हैं:

class ApplicationController 
    include SessionManagement 
end 
+0

'base.helper: current_user code' गलत है, यह' base.send: helper_method,: current_user' – kain

+0

धन्यवाद @ kain, छोटे टाइपो। यह 'helper_method' होना चाहिए। लेकिन आप बस 'base.helper_method,: current_user' लिख सकते हैं। – nathanvda

+0

नब प्रश्न: इस मामले में, सत्रहेल्पर का उपयोग करने और सत्र प्रबंधन मॉड्यूल का उपयोग करने के बीच क्या अंतर है? एक सहायक बस एक और मॉड्यूल नहीं है? –

6

वे प्रतीत होता है कि इस तथ्य का लाभ उठाने के लिए, रेल में, हेल्पर्स बस रूबी मॉड्यूल हैं।

मॉड्यूल में नियंत्रकों में साझा किया गया व्यवहार रखना, मेरी राय में, अच्छी प्रैक्टिस है। दूसरी ओर, एक हेल्पर में रखकर, संभावित रूप से भ्रामक है और मैं इससे बचूंगा। इसे "मानक" मॉड्यूल में रखें।

4

यह एक दार्शनिक तर्क यह है कि के रूप में एक ही स्तर पर सवाल यह है कि सवाल मचान में प्रदान की गई आरईएसटी विधि और यदि एक मचान बिल्कुल लायक है। आपको इस तथ्य पर विचार करना होगा कि RailsTutorial.org में ट्यूटोरियल पुस्तक एक गेट-अप-एंड-रेल रेल निर्देशक मार्गदर्शिका है। तो जिस उद्देश्य के लिए यह सेवा करता है, मुझे लगता है कि यह काम करता है।

हालांकि, नियंत्रकों और विचारों में आवश्यक कोड डालने के लिए कोई बेहतर जगह है? हाँ वहाँ है।

  • कुछ माइकल हार्टल अनुसरण कर सकते हैं Railstutorial फार्म और पूरे SessionHelperApplicationController
  • दूसरों में केवल आवश्यक दृश्य अर्थात sign_in, sign_out, current_user और पसंद के लिए आवश्यक सहायकों को बेनकाब करने का फैसला कर सकता शामिल हैं।
  • मुझे ऐसे कोड को /lib निर्देशिका में डालने का सुझाव मिलता है और जहां आवश्यक हो उसे शामिल करें।

सभी व्यवहार्य विकल्प हैं। जो भी आप लेते हैं वह प्रदर्शन में उतना ही महत्वपूर्ण नहीं हो सकता है क्योंकि रुबी को उस फ़ाइल को पार्स करना होगा जिसे आप कॉल करना चाहते हैं (या शामिल) कक्षा, मॉड्यूल या विधि से। क्या होता है, कक्षा में किसी भी कोड को निष्पादित करने से पहले, रूबी पूरी कक्षा के माध्यम से एक बार यह जानने के लिए जाती है कि इसमें क्या है। यह सब एक की जरूरत है पर निर्भर करता है और उनके एप्लिकेशन

2

FWIW के डिजाइन, मैं उपयोगकर्ता कक्षा में वर्तमान उपयोगकर्ता की दुकान:

class User < ActiveRecord::Base 
    cattr_accessor :current 
    ... 
end 

यह सभी 3 MVC स्तरों में संदर्भित किया जा सकता; यह नियंत्रक में की तरह तो (और इसी तरह प्रवेश पर, निश्चित रूप से) के लिए निर्धारित है:

def set_current_user 
    User.current = (session[:user_id]) ? User.find_by_id(session[:user_id]) : nil 
end 

अन्य बातों के अलावा, यह मेरे ActiveRecord स्तर पर ऑडिट लॉग कि वर्तमान उपयोगकर्ता (जब लागू हो) पर कब्जा करने के लिए अनुमति देता है।

+0

क्या यह एक समवर्ती समस्या पैदा करेगा? –

+0

मेरे पास तब तक कोई सहमति नहीं है जब तक User.current एप्लिकेशन नियंत्रक के भीतर सेट हो। वहां समय था जब मैंने प्रमाणीकृत सिस्टम की मॉड्यूल फ़ाइल में lib.current को lib.c में स्थापित किया था - और इसमें समवर्ती समस्याएं थीं (संभवतः उस बदले गए कोड में एक बग से संबंधित - मैं बहुत अधिक जांच करने के लिए परेशान किए बिना वापस लौटा)। अब मेरे पास एकीकरण परीक्षण है जो समवर्ती समस्याओं के लिए जांच करता है :)। –