Как реализовать перенаправление на все запросы (при определенных условиях)?

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"

но я заметил, что в Rails v2.1 (то, что я использую) @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

Как насчет того, чтобы сначала избавиться от глобальной переменной $account.По сути, вы настраиваете себя на серьезные ошибки, используя глобальный файл.Просто используйте переменную экземпляра вместо @ или, еще лучше, создайте в ApplicationController метод под названием current_account, который обращается к переменной экземпляра @current_account.

Если переопределений не слишком много, просто добавьте if в фильтр перенаправления.

Если действие! = отключен redirect () end

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top