Я хочу что-то настроить, чтобы, если учетная запись в моем приложении отключена, я хочу, чтобы все запросы перенаправлялись на сообщение «отключено».
Я установил это в своем 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.
Как лучше всего реализовать что-то подобное?





Если переопределений не так много, просто поместите if в фильтр перенаправления.
если действие! = отключено перенаправление () конец
У вас есть несколько вариантов.
Если ваш метод действия «disabled» имеет уникальное имя в области действия приложения, вы можете добавить исключение к вызову 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
Вы также можете использовать skip_before_filter для одного контроллера / метода, к которому вы не хотите применять фильтр.
Как насчет того, чтобы сначала избавиться от этой глобальной переменной $ account. Вы в основном настраиваете себя на несколько серьезных ошибок, используя глобальный. Просто используйте переменную экземпляра вместо @ или, еще лучше, создайте метод в ApplicationController с именем current_account, который обращается к переменной экземпляра @current_account.
Привет, Эрик, спасибо за предупреждение. Я был уверен, что есть лучший способ сделать это, я думаю, что метод current_account будет отличным вариантом. Ваше здоровье!
Я думаю, что это может быть самый простой способ его реализовать. Спасибо!