2009-08-25 8 views
27

Es gibt möglicherweise eine bessere Möglichkeit, dies zu tun, aber ich versuche, eine if-Anweisung in Rails, basierend auf der aktuellen Aktion, in einem Controller zu machen (dies wird in einer Ansicht verwendet werden).Rails bedingte ('if') Anweisungen basierend auf Controller-Aktion

Zum Beispiel, wenn es die Bearbeitungsseite oder die Show-Seite, etc. Ich möchte einen anderen Stil für etwas - gibt es eine if-Anweisung, die dies angeben kann?

(Ich brauche eine if-Anweisung, weil es in einem Teil verwendet wird, auf mehreren Seiten).

Danke!

Elliot

Antwort

47

Der params Hash, der verfügbar ist in der Steuerung :controller und :action Schlüssel enthält, die den Controller und Aktionsnamen der Anforderung angeben.

Daher könnten Sie

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

Ehrfürchtig Dank !!!! – Elliot

+1

Vielen Dank ... Nachricht aus der Zukunft: D –

3

sagen Sie es auf diese Weise tun können:

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 

hoffe, es =)

+0

Das funktioniert aber nur für das gesamte Layout der Seite, oder? Eher als ein wenn in einer partiellen gemäß der Frage. – Shadwell

+0

Ich habe den Code zu ApplicationController bearbeitet. In diesem Fall, da die Aktionen auf verschiedenen Controllern verwendet werden, ist es jetzt sinnvoller =) – Staelen

+0

Es wird nur noch das Layout für die Seite festgelegt, oder? – Shadwell

1

hilft Sie Layouts für partials verwenden:

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

Wenn Sie wollen o erarbeiten, welches Layout dynamisch verwendet werden soll, würde ich das in einen Helfer setzen. Also würden Sie am Ende mit

# 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 

Dies funktioniert nur unter bestimmten Umständen, aber möglicherweise, was Sie versuchen zu tun.

Hier finden Sie mehr.

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

18

Es ist keine gute Praxis IMO partials haben zu fragen, was die aktuellen Controller und Aktionsnamen sind. Denke "sag, frag nicht" (http://www.pragprog.com/articles/tell-dont-ask). Das heißt, anstatt die partielle fragen, es ist Anrufer über seinen Zustand, sagen die teilweise, was Sie es tun wollen.

Eine Möglichkeit, dies zu tun ist durch die Variablen auf die teilweise durch die locals Option vorbei:

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

Dann im Teil:

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