2008-09-25 5 views
7

मैं रेल रुबी पर अपने रूबी में उपयोगकर्ता के कार्यों को लॉग करना चाहता हूं।पर्यवेक्षक में सत्र तक पहुंचने का अच्छा विचार है या नहीं?

अब तक, मैं एक मॉडल पर्यवेक्षक अपडेट के बाद डेटाबेस के लिए लॉग सम्मिलित करता है और बनाता है कि है। जिस उपयोगकर्ता ने लॉग किया था, उसे संग्रहीत करने के लिए, मुझे सत्र तक पहुंच की आवश्यकता है लेकिन यह समस्याग्रस्त है।

सबसे पहले, यह MVC मॉडल टूट जाता है। दूसरा, तकनीक हैकिश से बाहर की ओर बढ़ती है, शायद यहां तक ​​कि मोंगल सर्वर पर कार्यान्वयन भी कर सकती है।

सही दृष्टिकोण लेने के लिए क्या है?

उत्तर

3

मैं यह एक बहुत ही दिलचस्प सवाल पाते हैं। मैं ज़ोर से एक पल के लिए यहाँ सोचने के लिए जा रहा हूँ ...

अंत में, क्या हम साथ सामना कर रहे हैं क्रम कार्यक्षमता का एक विशिष्ट सेट प्राप्त करने के लिए एक डिजाइन पैटर्न स्वीकार्य व्यवहार का उल्लंघन करने के लिए एक निर्णय है। तो, हम अपने आप से पूछना चाहिए

1) क्या संभव समाधान है कि नहीं MVC पैटर्न

2) का उल्लंघन होगा क्या संभव समाधान है कि MVC पैटर्न

3 का उल्लंघन होगा रहे हैं) कौन सा विकल्प सबसे अच्छा है? मैं डिजाइन पैटर्न और मानक प्रथाओं को बहुत महत्वपूर्ण मानता हूं, लेकिन साथ ही यदि उन्हें पकड़ना आपके कोड को अधिक जटिल बनाता है, तो सही समाधान अभ्यास का उल्लंघन करना बहुत अच्छा हो सकता है। कुछ लोग मुझ पर असहमत हो सकते हैं।

आइए पहले # 1 पर विचार करें।

मेरे सिर के ऊपर बंद, मैं निम्नलिखित संभव समाधान

ए) क्या तुम सच में, जो इन कार्यों, इस डेटा किसी भी तरह से मॉडल में संग्रहित किया जाना चाहिए प्रदर्शन कर रहा है में रुचि रखते हैं के बारे में सोच है? यह यह जानकारी आपके पर्यवेक्षक को उपलब्ध कराएगी। और इसका यह भी अर्थ है कि आपके ActiveRecord क्लास के किसी अन्य फ्रंट-एंड कॉलर को समान कार्यक्षमता मिलती है।

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

अब विकल्प # 2 पर विचार करें, MVC प्रथाओं को तोड़ दिया।

ए) जैसा कि आप प्रस्तावित करते हैं, आप अपने मॉडल पर्यवेक्षक को सत्र डेटा तक पहुंचने के साधन ढूंढ सकते हैं। आपने अपने मॉडल को अपने व्यावसायिक तर्क में जोड़ दिया है।

बी) अपनी परियोजना के बारे में अब और विवरण जानने के बिना यहाँ किसी भी अन्य :)

मेरा व्यक्तिगत झुकाव, के बारे में सोच नहीं कर सकते, या तो 1 ए, मैं देखते हैं अगर रिकॉर्ड करने के लिए लोगों, या 1C अनुलग्न करना चाहते हैं, तो केवल कुछ ही जगहें जहां मुझे ऐसा करने में दिलचस्पी है। यदि आप वास्तव में अपने सभी नियंत्रकों और कार्यों के लिए एक मजबूत लॉगिंग समाधान चाहते हैं, तो आप 1 बी पर विचार कर सकते हैं।

अपने मॉडल पर्यवेक्षक को सत्र डेटा ढूंढना थोड़ा "बदबूदार" है, और यदि आप किसी अन्य परियोजना/स्थिति/संदर्भ में अपने मॉडल का उपयोग करने का प्रयास करते हैं तो संभवतः तोड़ दिया जाएगा।

+0

मैं शायद अपनी सादगी की वजह से हो सकता है 1 ए की तरह कुछ के बारे में सोच रहा था,। – Jaryl

1

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

6

एचआरएम, यह एक चिपचिपा स्थिति है। आपको अच्छी तरह से काम करने के लिए एमवीसी का उल्लंघन करना बहुत अधिक है।

मैं इस तरह कुछ करना चाहते हैं:

class MyObserverClass < ActiveRecord::Observer 
    cattr_accessor :current_user # GLOBAL VARIABLE. RELIES ON RAILS BEING SINGLE THREADED 

    # other logging code goes here 
end 

class ApplicationController 
    before_filter :set_current_user_for_observer 

    def set_current_user_for_observer 
    MyObserverClass.current_user = session[:user] 
    end 
end 

यह एक सा hacky है, लेकिन यह कोई और अधिक hacky से कई अन्य कोर बातें मैंने देखा है रेल है।

आप सभी (यदि आप वैसे भी JRuby पर चलने यह केवल मामलों) यह threadsafe बनाने के लिए क्या करने की जरूरत होगी cattr_accessor बदलने एक उचित विधि के लिए, और यह धागा स्थानीय भंडारण में डेटा है संग्रहीत है

+2

हाय ओरियन, बस यह पाया क्योंकि मैं इस प्रकार के समाधान की तलाश में हूं। चूंकि यह कुछ साल हो गया है! क्या आप अभी भी इस समाधान का उपयोग करते हैं? उत्सुक अगर आप किसी भी थ्रेडेड प्रकार के मुद्दों में भाग गए? – WozPoz

+1

@WozPoz यह कोड थ्रेड सुरक्षित नहीं है, उसी प्रक्रिया में चल रहे धागे कक्षा चर साझा करेंगे। इस बाधा को पार करने के लिए, या तो थ्रेड-लोकल स्टोरेज का उपयोग करें या config.threadsafe के साथ अपना एप्लिकेशन चलाएं! = झूठी – laurie

0

अतीत में, इस तरह कुछ करने पर, मैंने 'वर्तमान उपयोगकर्ता'

पिछले उत्तरों को देखते हुए, मुझे वास्तविक सक्रिय रिकॉर्ड को संग्रहीत करने के सुझावों को देखने के लिए उपयोगकर्ता मॉडल वर्ग को विस्तारित करने की ओर रुख किया है। सत्र में उपयोगकर्ता। इसके कई नुकसान हैं।

  • यह सत्र डेटाबेस
  • में एक संभवतः बड़ी वस्तु संग्रहीत करता है इसका मतलब है कि उपयोगकर्ता के प्रति हर समय के लिए 'कैश की गई' है (या जब तक लॉगआउट मजबूर किया जाता है)। इसका अर्थ यह है कि इस उपयोगकर्ता की स्थिति में किए गए किसी भी बदलाव को तब तक पहचाना नहीं जाएगा जब तक कि उपयोगकर्ता लॉग आउट नहीं करता और वापस लॉग इन नहीं करता है। इसका मतलब है कि उपयोगकर्ता को अक्षम करने का प्रयास करने से वह लॉग ऑफ और बैक ऑन का इंतजार कर सकता है। यह शायद वह व्यवहार नहीं है जिसे आप चाहते हैं।

ताकि अनुरोध (शुरुआत में) की शुरुआत में आप सत्र से user_id ले लें और उपयोगकर्ता को पढ़ें। User.current_user को सेट करें।

कुछ इस तरह ...

 
class User 
    cattr_accessor :current_user 
end 

class Application 
    before_filter :retrieve_user 

    def retrieve_user 
    if session[:user_id].nil? 
     User.current_user = nil 
    else 
     User.current_user = User.find(session[:user_id]) 
    end 
    end 
end 
तब से इस पर

तुच्छ होना चाहिए।

+0

कक्षा आवेदन क्या होना चाहिए? – WozPoz

+0

मैं एक नियंत्रक कहूंगा। –

1

मुझे उठाए गए उत्तर द्वारा सुझाए गए सुझावों का एक साफ तरीका मिला।

http://pjkh.com/articles/2009/02/02/creating-an-audit-log-in-rails

यह समाधान किसी भी मॉडल के लिए ट्रैकिंग कार्यक्षमता जोड़ने के लिए एक AuditLog मॉडल के साथ ही एक TrackChanges मॉड्यूल का उपयोग करता है। जब भी आप अपडेट या निर्माण करते हैं, तब भी आपको नियंत्रक को एक लाइन जोड़ने की आवश्यकता होती है।

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