Как реализовать перенаправление на все запросы (при определенных условиях)? - PullRequest
4 голосов
/ 18 сентября 2008

Я хочу что-то настроить, чтобы, если учетная запись в моем приложении была отключена, я хотел, чтобы все запросы перенаправлялись на сообщение «отключено».

Я настроил это в моем 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 это не работает.

Как лучше всего реализовать что-то подобное?

Ответы [ 4 ]

6 голосов
/ 18 сентября 2008

У вас есть несколько вариантов.

Если ваш метод действия «отключен» имеет уникальное имя в области приложения, вы можете добавить исключение к вызову 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
3 голосов
/ 18 сентября 2008

Вы также можете использовать skip_before_filter для одного контроллера / метода, к которому вы не хотите применять фильтр.

1 голос
/ 18 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

если действие! = Отключено перенаправление () конец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...