Cosa c'e' di sbagliato?

route.rb

match “/:layout” => “company@index”

in application_controller ho:

before_filter :authenticate_user!
rescue_from DeviseLdapAuthenticatable::LdapException do |exception|
render :text => exception, :status => 500
end
protect_from_forgery
before_filter :set_layout

layout :specify_layout

def specify_layout
if @current_layout == :intra
“intranet”
elsif @current_layout == :inter
“internet”
else
“application”
end
end

def set_layout
if params[:layout] == “intraOp”
session[:current_layout] = :intra
elsif params[:layout] == “interOp”
session[:current_layout] = :inter
else
session[:current_layout] = nil
end
@current_layout = session[:current_layout]
end
end

in un altro controller ho:

skip_filter :authenticate_user!, :only => [:index, :show] unless
@current_layout.nil?

la condizione unless sembra che non venga presa in considerazione,
c’e’ qualcosa che sbaglio?

2012/2/12 Fabrizio R. [email protected]:

Non puoi passare unless in quel modo perch la condizione deve essere valutata al
momento della richiesta, non al momento della compilazione della classe.

Penso che tu possa passare una opzione :unless, ma non sono sicuro.

skip_filter :authenticate_user!, :only => [:index, :show], :unless => lambda {
@current_layout.nil? }

oppure

skip_filter :authenticate_user!, :only => [:index, :show], :if => lambda {
!@current_layout.nil? }

Pero’ non funziona lo stesso :frowning:

Non puoi passare unless in quel modo perch la condizione deve essere
valutata al momento della richiesta, non al momento della compilazione
della classe.

Penso che tu possa passare una opzione :unless, ma non sono sicuro.

skip_filter :authenticate_user!, :only => [:index, :show], :unless =>
lambda { @current_layout.nil? }

oppure

skip_filter :authenticate_user!, :only => [:index, :show], :if => lambda
{ !@current_layout.nil? }

Hai controllato se il valore di @current_layout cambia?
Solo l’opzione :if sia valida, unless non considerato. Inoltre userei
uno ‘skip_before_filter’. E metterei un bel logger nel lambda o un raise
per verificare se il valore cambia.

2012/2/12 Mauro [email protected]:

2012/2/12 Fabrizio R. [email protected]:

Hai controllato se il valore di @current_layout cambia?
Solo l’opzione :if sia valida, unless non considerato. Inoltre userei uno
‘skip_before_filter’.

skip_before_filter e’ deprecato in favore di skip_filter in rails 3.
Comunque il problema e’ quel before_filter :authenticate_user! in
application_controller che fa si che @current_layout non venga settato
se non dopo aver eseguito o skippato authenticate_user.

Mi correggo, la variabile @current_layout viene valorizzata,
evidentemente sembra che skip_filter rifiuti i conditionals if e
unless.

2012/2/12 Fabrizio R. [email protected]:

Hai controllato se il valore di @current_layout cambia?
Solo l’opzione :if sia valida, unless non considerato. Inoltre userei uno
‘skip_before_filter’.

skip_before_filter e’ deprecato in favore di skip_filter in rails 3.
Comunque il problema e’ quel before_filter :authenticate_user! in
application_controller che fa si che @current_layout non venga settato
se non dopo aver eseguito o skippato authenticate_user.