Rails: Verwirrt über die Syntax für die Übergabe von Einheimischen an Partials

99

Rails "Magie" verstehen, wenn es darum geht, Partials zu rendern (und Einheimische in sie zu überführen).

Warum funktioniert das:

<%= render "rabbits/form" %>

Und diese Arbeit:

<%= render "rabbits/form", :parent => @warren, :flash => flash %>

aber das funktioniert nicht :

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Aber das tut:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Wie kann ich diese Nuancen nachschlagen, damit ich die Leute auf SO nicht stören muss?

Meltemi
quelle
3
In einem Kommentar unten haben Sie gesagt, dass die Rails-API-Dokumente nicht so durchsuchbar sind. Sie sollten stattdessen diese Site ausprobieren: apidock.com/rails . Es hat auch Rubin und Rspec dort.
Ryeguy

Antworten:

152

Die kurze Antwort lautet: Die Rendermethode betrachtet das erste Argument, das Sie übergeben. Wenn Sie einen Hash übergeben (einschließlich :partial => 'foo', :locals => {blah blah blah}), werden alle Ihre Argumente als Hash übergeben und entsprechend analysiert.

Wenn Sie eine Zeichenfolge als erstes Argument übergeben, wird davon ausgegangen, dass das erste Argument Ihr Teilname ist, und der Rest wird als Ihre Einheimischen übergeben. Bei diesem nachfolgenden Aufruf wird jedoch tatsächlich zugewiesen :locals => your_locals_argument, was in diesem Fall das Ganze ist :locals => {locals hash}, anstatt nur {locals hash}; dh Sie enden :locals => {:locals => {locals hash}}eher mit als :locals => {locals hash}.

Mein Rat ist also, Werte immer explizit auf die gleiche Weise zu übergeben, damit Sie keine Probleme haben. Um dies zu erfahren, ging ich direkt zum Code selbst ( actionpack / lib / base.rb , render()Methode in Rails 2; Rails 3 ist anders). Es ist eine gute Übung.

Machen Sie sich außerdem keine Sorgen, dass Sie die Leute auf SO "belästigen". Deshalb gibt es diese Seite. Ich habe sogar etwas daraus gelernt.

Doug R.
quelle
5

Wenn Sie Folgendes angeben müssen: Einheimische, müssen Sie Folgendes angeben: teilweise oder: Vorlage

<%= render :partial => "rabbits/form", :locals => {...} %>

sollte arbeiten

Sethvargo
quelle
Es hat damit zu tun, wie Ruby den Hash bewertet, wenn Sie auf diese Weise neugierig sind.
Sethvargo
In der Tat funktioniert es ... wie ich in meiner Frage angegeben habe ... aber ich frage mich, warum? und wo ist das dokumentiert? nur durch einen Blick auf die Quelle? Und wenn dies der einzige Weg ist, diese unzähligen Nuancen in Rails zu finden und zu verstehen, frage ich mich, wie und wo ich dies aus der Quelle heraus lokalisieren und interpretieren soll. Ich kann nicht einfach auf "Rendern" klicken und dann einen Drilldown zur Quelle durchführen (sowieso nicht mit TextMate) oder kann ich?
Meltemi
1
Ah! also bist du eigentlich interessiert :). Ja, die einzige Möglichkeit, diese Dinge herauszufinden, besteht darin, a.) Eine Ahnung wie Sie zu haben und b.) Den Quellcode anzuzeigen. Ich habe keine Ahnung, wie ich die Quelle
aufschlüsseln soll
ok, ich werde beißen ... wie siehst du solche Sachen nach? graben Sie nur durch Ihre clone https://github.com/rails/rails.git? oder gibt es einen besseren weg Sorry , aber ich bin relativ neu in RoR und habe noch nicht gefunden eine gute / easy / konsistente Art und Weise Rails Dokumentation nachschlagen ... so dass es IST vorhanden. http://api.rubyonrails.org/ist nicht leicht zu durchsuchen. und die Quelle von git ist auch nicht ... seufz
Meltemi
Ich bin kein Experte, aber ich benutze Aptana Studio. Es basiert auf derselben Plattform wie Eclipse (wenn Sie vertraut sind). Es ermöglicht Ihnen, "zu klicken" und zu verfolgen, wie Sie gesagt haben. Sie können auch eine In-Code-Suche durchführen und es hat ein eingebautes Terminal usw. Achtung - es ist eine ziemlich große Datei
Sethvargo
2

Um ehrlich zu sein, ich kenne diese Anwendungsfälle nur, weil ich in den letzten Jahren mit Rails Schritt gehalten habe und die Ankündigungen gelesen habe, dass eine neue Methode hinzugefügt wurde. Ich mache oft selbst einen Fehler, aber normalerweise ist er leicht zu korrigieren.

Es ist einer dieser Teile der Rails-API, die nicht gründlich durchdacht wurden, wenn Sie mich fragen. Es hat im Laufe der Jahre immer mehr syntaktischen Zucker angesammelt, ohne das alte Verhalten zu missbilligen. Die Rendermethode hat Diabetes.

Um es noch schlimmer zu machen, verhält sich das Rendern in Controller und Ansicht unterschiedlich. Ich sehe mir auch den Inhalt des ersten Arguments an, um festzustellen, ob es sich um eine Datei, eine Vorlage, eine Aktion oder einen Teil handelt. Wenn es mit einem Schrägstrich beginnt, ist es eine Datei oder so etwas.

Ich bin dafür, wenn immer möglich, die kürzere Notation zu verwenden. Weil die kurzen Notationen die Absicht recht gut kommunizieren. Beim Lesen macht es normalerweise das, was Sie denken. Das Schreiben von Partials ist nicht einfach.

iain
quelle
1

Hier ist die Quelle der Rendermethode von http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render :

def render(options = {}, locals = {}, &block)
  case options
  # Here is your last case
  when Hash
    if block_given?
      _render_partial(options.merge(:partial => options.delete(:layout)), &block)
    elsif options.key?(:partial)
      _render_partial(options)
    else
      template = _determine_template(options)
      lookup_context.freeze_formats(template.formats, true)
      _render_template(template, options[:layout], options)
    end
  when :update
    update_page(&block)
  else
    # here the first three cases
    _render_partial(:partial => options, :locals => locals)
  end
end

Ich hoffe das hilft!

Andrea Salicetti
quelle
Das hilft , danke! Aber es hilft mir nicht , mir selbst zu helfen ... wenn Sie wissen, was ich meine ...
Meltemi