أفضل طريقة لتمديد ولايات restful_authentication AASM
-
07-07-2019 - |
سؤال
وكان لي مؤخرا على تمديد ولايات 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.