Como implementar um redirecionamento em todas as solicitações (em determinadas condições)?
-
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?
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