2009-04-30 21 views
26

En un controlador en mi aplicación Rails, puedo hacer esto:before_filter y respond_to formatos

before_filter :login_required, :except => :index 

Pero me gustaría aplicar el filtro no sólo se basa en el nombre de la acción, sino en el formato de la solicitud. En otras palabras, me gustaría hacer algo como esto:

before_filter :login_required, :except => {:action => :index, :format => :js} 

¿Esto es posible?

Respuesta

25

Tendrás que hacer un poco de tu cuenta. Prueba esto como punto de partida.

before_filter :login_required, :except => [:index] 

before_filter(:only => :index) do |controller| 
    login_required unless controller.request.format.js? 
end 
+1

Gracias por su ayuda. Solo tuve que reemplazar el nombre de usuario requerido con controller.send (: login_required) before_filter (: only =>: index) do | controller | controller.send (: login_required) a menos que controller.request.format.js? final – gdelfino

+0

Permítanme repetir mi comentario ya que el código no apareció como esperaba. Solo tuve que reemplazar el login_required con controller.send (: login_required) Gracias. – gdelfino

+0

funcionó como el encanto con la punta de gdelfino – whizcreed

10

Otra forma, que creo que es más limpio que la respuesta aceptada, es el uso de los if o unless opciones con un lambda. Simplemente me gusta que el nombre del método aparezca como un símbolo, por lo que está estandarizado con los otros filtros del controlador. Esto funciona en Rails 3 en adelante.

before_filter :login_required, except: :index, 
    unless: -> { |controller| controller.request.format.js? } 
13

Recuerde, también puede extraer la lambda a un método. Esto puede ayudar con la legibilidad. También puede facilitar el uso de la misma verificación en múltiples filtros.

before_filter :login_required, except: :index, unless: :js_request? 

private 

def js_request? 
    request.format.js? 
end 
+1

El trabajo perfecto, pero yo uso 'request.format.json?' – inye

Cuestiones relacionadas