2009-08-25 7 views
27

Il pourrait y avoir une meilleure façon de faire cela, mais j'essaie de faire une instruction if dans les rails, basée sur l'action en cours, dans un contrôleur (ceci sera être utilisé dans une vue). Par exemple, si c'est la page d'édition, ou la page d'affichage, etc. Je voudrais un style différent pour quelque chose - y a-t-il une instruction if qui peut spécifier cela?Rails conditionnels ('if') instructions basées sur l'action du contrôleur

(J'ai besoin d'une instruction if, car elle est utilisée dans un partiel, sur plusieurs pages).

Merci!

Elliot

Répondre

47

Le hachage params qui est disponible dans le contrôleur contient :controller et :action clés, qui spécifient les noms de contrôleur et d'action de la demande.

Par conséquent, vous pourriez dire

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

merci !!!! Impressionnant – Elliot

+1

Un grand merci ... message du futur: D –

3

Vous pouvez le faire de cette façon:

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 

espère que cela aide =)

+0

Cela ne fonctionne que pour l'ensemble de la mise en page de la page, n'est-ce pas? Plutôt qu'un si dans un partiel selon la question. – Shadwell

+0

J'ai modifié le code à ApplicationController. Dans ce cas, puisque les actions sont utilisées dans différents contrôleurs, cela a plus de sens maintenant =) – Staelen

+0

Cela ne fait que définir la disposition de la page, n'est-ce pas? – Shadwell

1

Vous pouvez utiliser mises en page pour partials aussi:

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

Si vous voulez t o Déterminer quelle disposition utiliser dynamiquement Je mettrais cela dans une aide. Donc vous finiriez avec

# 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 

Cela ne fonctionnera que dans certaines circonstances, mais pourrait être ce que vous essayez de faire.

Voir plus ici.

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

18

Ce n'est pas une bonne pratique de l'OMI d'avoir demander ce partials le contrôleur en cours et les actions sont. Pensez "dire, ne demandez pas" (http://www.pragprog.com/articles/tell-dont-ask). C'est-à-dire, plutôt que d'avoir le partiel demander à son appelant sur son état, dire le partiel ce que vous voulez qu'il fasse.

Une façon de le faire est par des variables passant à la partie par l'option locals:

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

Puis, dans la partie:

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