Hoe om 'n aanstuur Implementeer op alle versoeke (op sekere voorwaardes)?
-
01-07-2019 - |
Vra
Ek wil iets op te rig sodat as 'n rekening binne my jeug is afgeskakel, ek wil alle versoeke om herlei word na 'n "gestremde" boodskap.
Ek het hierdie opstel in my 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
Natuurlik is dit nie heeltemal werk as dit gaan in 'n oneindige lus as die rekening is nie aktief. Ek het gehoop om so iets te gebruik:
redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
maar ek het opgemerk dat in Rails v2.1 (wat ek gebruik), @controller is nou kontroleerder en dit lyk nie te werk in ApplicationController.
Wat sou die beste manier om so iets te implementeer?
Oplossing
Jy kan ook 'n skip_before_filter
gebruik vir die een kontroleerder / metode wat jy wil nie hê die filter van toepassing op.
Ander wenke
Jy het 'n paar opsies.
As jou optrede metode "gestremde" is uniek in die omvang van die aansoek genoem, jy kan 'n uitsondering toe te voeg tot die before_filter oproep, soos volg:
before_filter :check_account, :except => :disabled
As jy wil spesifiek gaan vir die kontroles en aksie in die filter, moet u daarop let dat hierdie kode is reeds deel van die beheerder voorwerp. Jy kan verwys na dit as "self," soos so:
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
Ten slotte, as jy wil, kan jy die filter metode oorskryf van binne MainController.rb:
def check_account
return if action_name == "disabled"
super
end
Hoe gaan dit met die eerste om ontslae te raak van daardie globale $ rekening veranderlike. Jy is basies die opstel van jouself vir 'n paar ernstige foute deur die gebruik van 'n globale. gebruik net 'n geval veranderlike in plaas @ of beter nog 'n metode te skep op ApplicationController genoem current_account wat toegang tot die @current_account byvoorbeeld veranderlike.
As Theres nie te veel oorheers dan net sit die as in die aanstuur filter
As aksie! = Gestremde lei () einde