سؤال

أريد أن سجل إجراءات المستخدم في روبي على القضبان التطبيق.

حتى الآن لدي نموذج المراقب أن إدراج السجلات إلى قاعدة البيانات بعد التحديثات ويخلق.من أجل تخزين المستخدم التي يتم تنفيذ العمل الذي تم تسجيل, لا تتطلب الوصول إلى الدورة ولكن هذا هو إشكالية.

أولا, فإنه يكسر نموذج MVC.ثانيا: تقنيات مجموعة من hackish إلى غريب, وربما حتى ربط تنفيذ الهجين الخادم.

ما هو النهج الصحيح ؟

هل كانت مفيدة؟

المحلول

أجد أن هذا سؤال مثير جدا للاهتمام.انا ذاهب الى التفكير بصوت عال هنا لحظة...

في نهاية المطاف, ما نواجه هو قرار تنتهك تصميم نمط ممارسة مقبولة من أجل تحقيق مجموعة محددة من الوظائف.لذا يجب أن نسأل أنفسنا

1) ما هي الحلول الممكنة التي من شأنها أن لا تنتهك نمط MVC

2) ما هي الحلول الممكنة التي أن تنتهك نمط MVC

3) الخيار الذي هو أفضل ؟ أنا أعتبر تصميم أنماط الممارسات القياسية مهم جدا ، ولكن في نفس الوقت إذا عقد لهم يجعل التعليمات البرمجية الخاصة بك أكثر تعقيدا ، ثم الحل الصحيح قد يكون جيدا أن تنتهك هذه الممارسة.بعض الناس قد يختلفون معي في ذلك.

يتيح النظر في #1 الأولى.

من على قمة رأسي ، أعتقد التالية الحلول الممكنة

أ) إذا كنت مهتما حقا في الذين يتم تنفيذ هذه الإجراءات يجب أن تكون هذه البيانات المخزنة في نموذج بأي شكل من الأشكال ؟ من شأنه أن يجعل هذه المعلومات متاحة إلى المراقب.وهذا يعني أيضا أن أي جبهة أخرى في نهاية المتصل الخاص بك ActiveRecord الطبقة يحصل على نفس الوظيفة.

ب) إذا لم تكن مهتمة حقا في فهم الذي خلق دخول, ولكن أكثر اهتماما في تسجيل على شبكة الإنترنت الأعمال أنفسهم ، فإنك قد تنظر في "مراقبة" وحدة تحكم الإجراءات.لقد مر بعض الوقت منذ أن كنت مطعون حول القضبان المصدر, لذلك أنا لست متأكدا من ActiveRecord::المراقب "يلاحظ" النموذج ، ولكن قد تكون قادرة على التكيف مع وحدة تحكم المراقب.في هذا المعنى, لا مراقبة النموذج بعد الآن ، فمن المنطقي أن تجعل الدورة وغيرها من وحدة تحكم نوع البيانات المعلومات إلى أن المراقب.ج) الحل الأبسط ، على الأقل مع "هيكل" ، هو ببساطة إسقاط تسجيل الكود في نهاية العمل الخاص بك الأساليب التي تشاهدها.

النظر في الخيار رقم 2 الآن كسر MVC الممارسات.

أ) كما تقترح يمكنك أن تجد وسيلة للحصول على النموذج الخاص بك المراقبين من الوصول إلى بيانات الدورة.لقد بالإضافة إلى النموذج الخاص بك للأعمال التجارية الخاصة بك والمنطق.

ب) لا يمكن أن نفكر من أي أشخاص آخرين هنا :)

الشخصية الميل ، دون معرفة أكثر تفاصيل حول المشروع الخاص بك ، إما 1A, إذا كنت ترغب في إرفاق الناس إلى سجلات أو 1C إذا كان هناك فقط عدد قليل من الأماكن حيث أنا مهتم في القيام بذلك.إذا كنت ترغب حقا قوي تسجيل الحل لجميع وحدات التحكم الخاصة بك و الإجراءات ، قد تنظر 1B.

بعد أن النموذج الخاص بك المراقب تجد بيانات الدورة قليلا "نتن" ، و من المرجح أن كسر إذا حاولت استخدام النموذج الخاص بك في أي مشروع آخر/الوضع/السياق.

نصائح أخرى

إدارة الموارد البشرية, هذا هو الوضع لزجة.لديك إلى حد كبير تنتهك MVC للحصول على عمل جيد.

كنت تفعل شيئا من هذا القبيل:

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 من العديد الأساسية الأخرى القضبان الأشياء التي رأيتها.

كل ما سوف تحتاج إلى القيام به لجعله threadsafe (هذا فقط يهم إذا كنت تعمل على jruby على أي حال) هو تغيير cattr_accessor أن تكون طريقة الصحيح ، وقد يتم تخزين البيانات في موضوع التخزين المحلي

أنت على حق حول هذا الموضوع كسر MVC.أود أن أقترح استخدام الاستدعاء في وحدات التحكم في الغالب لأن هناك حالات (مثل النموذج الذي حفظ ويسمى ولكن فشل التحقق من الصحة) حيث كنت لا تريد مراقب تسجيل أي شيء.

لقد وجدت وسيلة نظيفة على فعل ما اقترحته الجواب التقطت.

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

هذا الحل يستخدم AuditLog نموذج فضلا عن TrackChanges وحدة لإضافة تتبع وظيفة أي نموذج.فإنه لا يزال يتطلب منك إضافة خط إلى وحدة التحكم عند تحديث أو إنشاء على الرغم من.

في الماضي, عندما تفعل شيئا مثل هذا ، وتميل نحو توسيع المستخدم نموذج الفئة لتشمل فكرة 'المستخدم الحالي'

النظر في الإجابات السابقة ، أرى اقتراحات لتخزين الفعلية السجل النشط المستخدم في الدورة.هذا له مساوئ عديدة.

  • فإنه يخزن ربما كائن كبير في الدورة قاعدة البيانات
  • فهذا يعني أن نسخة من المستخدم 'مؤقتا' في جميع الأوقات (أو حتى الخروج القسري).وهذا يعني أن أي تغيير في حالة المستخدم هذا لن يكون معترف بها حتى يقوم المستخدم بتسجيل الخروج وتسجيل مرة أخرى.وهذا يعني على سبيل المثال أن محاولة تعطيل المستخدم سوف تنتظره تسجيل الخروج مرة أخرى.قد لا يكون هذا هو السلوك الذي تريده.

حتى أنه في بداية الطلب (في تصفية) تأخذ user_id من الدورة و قراءة المستخدم ، إعداد المستخدم.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

من ثم ينبغي أن تكون تافهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top