كيفية تنفيذ إعادة التوجيه على جميع الطلبات (بشروط معينة)؟

StackOverflow https://stackoverflow.com/questions/89543

  •  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 في مرشح إعادة التوجيه

إذا كان الإجراء! = تعطيل إعادة توجيه () نهاية

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