29 Stimmen

Rails bedingte ('if') Anweisungen basierend auf Controller-Aktionen

Es könnte ein besserer Weg, dies zu tun, aber ich versuche, eine if-Anweisung in Schienen, basierend auf der aktuellen Aktion, in einem Controller (dies wird in einer Ansicht verwendet werden) zu machen.

Zum Beispiel, wenn es die Seite "Bearbeiten" oder die Seite "Anzeigen" ist, usw. Ich möchte einen anderen Stil für etwas - gibt es eine if-Anweisung, die dies angeben kann?

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

Gracias.

Elliot

52voto

Daniel Vandersluis Punkte 87406

Le site params Hash, der im Controller verfügbar ist, enthält :controller y :action Schlüssel, die den Namen des Controllers und der Aktion der Anfrage angeben.

Man könnte also sagen

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

23voto

showaltb Punkte 918

Es ist keine gute Praxis IMO zu haben, partials fragen, was die aktuelle Controller und Aktion Namen sind. Denken Sie "erzählen, nicht fragen" ( http://www.pragprog.com/articles/tell-dont-ask ). Das heißt, anstatt dass das Teilprogramm seinen Aufrufer nach seinem Zustand fragt, sagen den Teilbereich, was er tun soll.

Eine Möglichkeit, dies zu tun, ist die Übergabe von Variablen an den Teilprozess durch die locals Option:

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

Dann im Teilbereich:

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

4voto

Staelen Punkte 7551

Sie können es so machen:

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

Ich hoffe, es hilft =)

1voto

jonnii Punkte 27657

Sie können Layouts auch für Teilbereiche verwenden:

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

Wenn Sie herausfinden wollen, welches Layout dynamisch verwendet werden soll, würde ich das in einen Helper packen. So 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 wird nur unter bestimmten Umständen funktionieren, aber vielleicht ist es genau das, was Sie erreichen wollen.

Sehen Sie hier mehr.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X