Como implementar um redirecionamento em todas as solicitações (em determinadas condições)?

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu quero definir alguma coisa de modo que se uma conta dentro do meu aplicativo está desativado, quero que todos os pedidos para ser redirecionado para uma mensagem "desativado".

Eu configurar isso no meu 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

Claro, isso não funciona muito bem, uma vez que entra em um loop infinito se a conta não está ativa. Eu estava esperando para usar algo como:

redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"

mas notei que em Rails v2.1 (o que eu estou usando), @controller agora é controlador e este não parece trabalho em ApplicationController.

Qual seria a melhor maneira de implementar algo assim?

Foi útil?

Solução

Você também pode usar um skip_before_filter para o controlador / método que você não quer ter o filtro aplicar a.

Outras dicas

Você tem várias opções.

Se o seu método de ação "desativado" é um nome único no âmbito da aplicação, você pode adicionar uma exceção à chamada before_filter, como este:

before_filter :check_account, :except => :disabled

Se você quiser verificar especificamente para o controlador e ação no filtro, você deve observar que este código já faz parte do objeto controlador. Você pode se referir a ele como "eu", como assim:

  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

Finalmente, se você quiser, você pode substituir o método do filtro de dentro MainController.rb:

  def check_account
    return if action_name == "disabled"
    super
  end

Como cerca de primeiro se livrar dessa conta variável global $. Você está se basicamente para vários erros graves usando um global. Basta usar uma variável de instância, em vez @ ou melhor ainda criar um método em ApplicationController chamado current_account que acessar a variável de instância @current_account.

Se há não muitas substituições, em seguida, basta colocar o caso no filtro de redirecionamento

Se a ação! = Desativado redireccionar () end

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top