كيفية تنفيذ إعادة التوجيه على جميع الطلبات (بشروط معينة)؟
-
01-07-2019 - |
سؤال
أريد إعداد شيء ما بحيث إذا تم تعطيل حساب داخل التطبيق الخاص بي، أريد إعادة توجيه جميع الطلبات إلى رسالة "معطل".
لقد قمت بإعداد هذا في ApplicationController الخاص بي:
class ApplicationController < ActionController::Base
before_filter :check_account
def check_account
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
end
بالطبع، هذا لا يعمل تمامًا لأنه يدخل في حلقة لا نهائية إذا لم يكن الحساب نشطًا.كنت أتمنى استخدام شيء مثل:
redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
لكنني لاحظت أنه في الإصدار 2.1 من Rails (ما أستخدمه)، أصبح @controller الآن وحدة تحكم ويبدو أن هذا لا يعمل في ApplicationController.
ما هي أفضل طريقة لتنفيذ شيء مثل هذا؟
المحلول
يمكنك أيضًا استخدام أ skip_before_filter
لوحدة التحكم/الطريقة الوحيدة التي لا تريد تطبيق الفلتر عليها.
نصائح أخرى
لديك عدة خيارات.
إذا تم تسمية طريقة الإجراء "معطل" بشكل فريد في نطاق التطبيق، فيمكنك إضافة استثناء لاستدعاء before_filter، مثل هذا:
before_filter :check_account, :except => :disabled
إذا كنت تريد التحقق بشكل خاص من وحدة التحكم والإجراء في الفلتر، فيجب ملاحظة أن هذا الرمز هو بالفعل جزء من كائن وحدة التحكم.يمكنك الإشارة إليها باسم "الذات"، مثل هذا:
def check_account
return if self.controller_name == "main" && self.action_name == "disabled"
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
أخيرًا، إذا أردت، يمكنك استبدال طريقة التصفية من داخل MainController.rb:
def check_account
return if action_name == "disabled"
super
end
ماذا عن التخلص أولاً من هذا الحساب المتغير الشامل $.أنت تقوم بشكل أساسي بإعداد نفسك لبعض الأخطاء الخطيرة باستخدام ملف global.ما عليك سوى استخدام متغير مثيل بدلاً من @ أو الأفضل من ذلك إنشاء طريقة على ApplicationController تسمى current_account والتي تصل إلى متغير مثيل @current_account.
إذا لم يكن هناك الكثير من التجاوزات، فما عليك سوى وضع if في مرشح إعادة التوجيه
إذا كان الإجراء! = تعطيل إعادة توجيه () نهاية