2016-04-19 9 views
1

Ich sehe in routes.rb wie dieseZweck% w in Ruby on Rails

%w(about mission path standard getting_started welcome infection instruction implementation).each do |page| 
    get page, to: "pages##{page}" 
end 

Und wenn ich home Controller zu sehen, es hat nicht nein Aktionen, oberhalb der Liste. Aber die Verbindung funktioniert einwandfrei.

Ich möchte wissen, was diese Codezeilen tun?

Antwort

4
%w(about mission path standard getting_started welcome infection instruction implementation).each do |page| 
    get page, to: "pages##{page}" 
end 

Der Code funktioniert wie: %w(foo bar) für Array eine Abkürzung ["foo", "bar"]

.each do |page| 

Es jedes Element Schleifen wie in der 1. Schleife der Wert von page = "foo"

get page, to: "pages##{page}" 

wird diese Linie

werden
get foo, to: "pages#foo" 

, wenn der Benutzer Treffer/foo werden Sie Aktion von Seiten Controller foo umgeleitet, wird dies auch für andere Elemente gleich sein.

Somit macht diese einfache Routen für alle Elemente in% w()

0

Der obige Code definiert Aktionen, die zu den Seiten Controller und nicht zum Home Controller gehören.

Hoffe, dass Informationen Ihnen helfen, die Dinge herauszufinden.

1

% w ist ein Ruby-Prozessor, der die eingegebene Zeichenfolge in den Leerraum aufteilt und ein Array ausgibt.

dann gilt die

get page, to: "pages##{page}" 

auf die spezifischen Einträge in dem Array.

Der Grund, warum Sie die in PagesController definierten Aktionen nicht sehen, liegt daran, dass die Controller-Aktionen wahrscheinlich leer sind, da es sich wahrscheinlich um semistatische Seiten handelt.

In diesem Fall benötigt die Ruby on Rails-Anwendung nur die korrekten Ansichten, um an Ort und Stelle zu sein und keine bestimmte Aktion zu definieren.

2

Wenn es funktioniert, dann sollten Sie vielleicht nach dem page Controller suchen, nicht den home Controller.

Teil:

%w(about mission path standard getting_started welcome infection instruction implementation) 

% w (- funktioniert nur für Array von Strings und ist nur eine andere Art zu schreiben:

['about', 'mission', 'path', 'standard', 'getting_started', 'welcome', 'infection', 'instruction', 'implementation'] 

Es ist bequemer, weil Sie keine Angst haben über Kommas und andere, nur einzelne Teile Array von Raum.

Wenn Sie iterieren (.each) dieses und in Block tun Sie get page, to: "pages##{page}" es tut jeder für ite m:

get 'about', to: "pages#about" 

get 'mission', to: "pages#mission" 

und so weiter. Und in diesem Fall ist der Controller "Seiten" und Aktion ist "über" usw.

ist hier um mehr über% w: http://ruby-doc.org/core-2.2.3/doc/syntax/literals_rdoc.html#label-Percent+Strings

Über Routing: http://guides.rubyonrails.org/routing.html#singular-resources

0

Zu meinem Verständnis zu definieren, die eigentliche Frage ist, wie diese Arbeits ist, wenn keine Aktionen in home controller definiert sind.

Die Route, die Sie beschreiben nur eine Reihe von verschiedenen Aktionen definiert, die gegen Ihre home controller ausgeführt werden können, wie about, mission usw.

für diese Seiten Um Ihnen nur in app/views/pages/about.html.erb benötigen eine entsprechende Ansicht angezeigt damit es angezeigt wird.

Es gibt keine Notwendigkeit zu definieren Aktionen in Controller wie def about, um Ansichten anzuzeigen. Sie müssten sie definieren ONLY, wenn Sie einige Variablen für sie in der Ansicht wie @my_name angezeigt werden möchten, aber per Definition benötigen Sie keine Controller-Aktionen, um sie anzuzeigen