سؤال

وكان لي مؤخرا على تمديد ولايات AASM للحصول على أحدث نسخة من restful_authentication (جيثب) في واحدة من التطبيقات الخاصة بي. أزلت "تشمل تفويض :: AasmRoles"، نسخ الدول والأحداث الحالية من البرنامج المساعد وإجراء التغييرات اللازمة لدعم "نشر" دولة إضافية على نموذج حسابي.

هل لديها وسيلة نظافة للتعامل مع هذا؟ بمعنى آخر. مجرد تجاوز الأحداث الدولة؟ وكنت قادرا على إضافة أحداث جديدة باستخدام البرنامج المساعد كما هو، ولكن أنا لم أكن قادرا على تجاوز مجرد أحداث دولة بالفعل في restful_auth لذلك اضطررت لإزالة التضمين والكتابة بها نفسي استخدامه كنقطة انطلاق.

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

المحلول

وإضافة دولة في AASM يتكون من إنشاء كائن الدولة الجديد، والذي ثم تضاف إلى AASM :: StateMachine [العضو] .states مجموعة، والتي تبدو مثل هذا:

def create_state(name, options)
 @states << AASM::SupportingClasses::State.new(name, options) unless @states.include?(name)
end

ما يجب ملاحظته هنا هو أنه لن يسمح لتجاوز حالة بمجرد تعيينه. إذا تم تعيين دولة بنفس الاسم مرة أخرى، طريقة create_state فقط يتجاهل ذلك. ل slove هذه المشكلة، يمكنك استخدام شيء مثل هذا في نموذج المستخدم الخاص بك:

# this will remove the state with name :name from the states array 
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == :name })
# ... so we can define the state here again
aasm_state :name ...

إذا كنت مجرد إعادة تعريف الدولة يجب أن يكون على ما يرام الآن. ولكن إذا كنت ترغب في إزالة الدولة تماما، يجب أن undefine طريقة محددة في الجسم طريقة aasm_state أيضا. يجب أن يكون من الممكن مع الدعوة شيئا مثل:

undef_method :name

ويجب أن يكون الوضع نفسه مع الأحداث (مجرد استخدام "الأحداث" بدلا من "الدول" في القانون). من الناحية المثالية، وجعلها أسلوب فئة النموذج المستخدم أن يتجاوز أساليب محددة في وحدة AASM. في حالة الدول سيبدو هذا:

def aasm_state(name, options={})
  states = AASM::StateMachine[self].states
  states.delete(states.find{ |s| s == name.to_sym })
  super(name, options)
end

تحذير: قد لا يكون على حق. هذا الرمز لم تختبر، أنا فقط حظيت بها من خلال النظر إلى شفرة المصدر من AASM.

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