2009-08-25 15 views
27

Puede haber una forma mejor de hacerlo, pero estoy tratando de hacer una instrucción if en rieles, basada en la acción actual, en un controlador (esto ser usado en una vista).Sentencias condicionales de Rails ('if') basadas en la acción del controlador

Por ejemplo, si es la página de edición, o la página de presentación, etc. Me gustaría un estilo diferente para algo: ¿hay una declaración if que pueda especificar esto?

(Necesito una instrucción if, porque se usa de forma parcial, en varias páginas).

Gracias!

Elliot

Respuesta

47

El params hash que está disponible en el controlador contiene :controller y :action llaves, que especifican los nombres de controlador y la acción de la solicitud.

Por lo tanto se podría decir

if params[:action] == "foo" 
    # Show stuff for action 'foo' 
elsif params[:action] == "bar" 
    # Show stuff for action 'bar' 
elsif ... 
    # etc. 
end 
+1

impresionante gracias !!!! – Elliot

+1

Muchas gracias ... mensaje del futuro: D –

3

Usted puede hacerlo de esta manera:

class ApplicationController < ActionController::Base 
    layout :set_layout 

    def set_layout 
    case params[:action] 
    when "foo" 
     "foo_layout" 
    when "bar" 
     "bar_layout" 
    ... 
    else 
     "default_layout" 
    end 
    end 

    ... 

end 

espero que ayude =)

+0

Eso solo funciona para todo el diseño de la página, ¿o no? En lugar de un si en un parcial según la pregunta. – Shadwell

+0

he editado el código para ApplicationController. En ese caso, dado que las acciones se usan en diferentes controladores, tiene más sentido ahora =) – Staelen

+0

Aún así, simplemente establece el diseño de la página, ¿no? – Shadwell

1

Puede utilizar diseños de los parciales también:

<%= render :partial => 'some_partial', :layout => 'wrap_with_stuff' %> 

Si quieres t o averigüe qué diseño usar dinámicamente, lo pondría en una ayuda. Así que terminarías con

# In your view 

<%= render :partial => 'some_partial', :layout => layout_for_my_partial %> 

# In your helper 

def layout_for_my_partial 
    params[:action] == 'show' ? 'show_wrapper' : 'everything_else_wrapper' 
end 

Esto solo funcionará en algunas circunstancias, pero podría ser lo que estás tratando de hacer.

Vea más aquí.

http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts

18

No es una buena práctica tener OMI parciales preguntando qué los nombres de controlador y la acción son actuales. Piense "dígale, no pregunte" (http://www.pragprog.com/articles/tell-dont-ask). Es decir, en lugar de hacer que el parcial pregunte a la persona que llama sobre su estado, diga el parcial de lo que quiere que haga.

Una forma de hacerlo es haciendo pasar variables a la parcial a través de la opción locals:

<%= render :partial => "/common/toolbar", :locals => {:edit => true} %> 

A continuación, en el parcial:

<% if defined?(edit) && edit %> 
... stuff appropriate to edit mode 
<% end %> 
Cuestiones relacionadas