Rails: confuso circa la syntax per passare i locali ai partial

Comprendere le Rails “magiche” per quanto riguarda il rendering dei partial (e il passaggio dei locals).

Perché funziona?

 

E questo lavoro:

  @warren, :flash => flash %> 

ma questo non funziona:

  { :parent => @warren, :flash => flash } %> 

Ma questo:

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

    Inoltre, come posso cercare queste sfumature in modo da non dover disturbare le persone su SO?

    La risposta breve è che il metodo render guarda il primo argomento che passi. Se passi in un hash (che include :partial => 'foo', :locals => {blah blah blah} ) allora passerà in tutti i tuoi argomenti come un hash e li analizzi di conseguenza.

    Se passi una stringa come primo argomento, si presuppone che il primo argomento sia il tuo nome parziale e passerà il resto come i tuoi locali. Tuttavia, in quella chiamata successiva, in realtà assegna :locals => your_locals_argument , che in questo caso è l’intero :locals => {locals hash} , invece di solo {locals hash} ; cioè si finisce con :locals => {:locals => {locals hash}} , piuttosto che :locals => {locals hash} .

    Quindi il mio consiglio è solo di passare sempre i valori nello stesso modo sempre e non avrai problemi. Per saperne di più, sono andato direttamente al codice stesso (metodo actionpack / lib / base.rb , render() in Rails 2; Rails 3 è diverso). È un buon esercizio.

    Inoltre, non preoccuparti di “disturbare” le persone su SO. Ecco perché questo sito esiste. Ho persino imparato qualcosa da questo.

    se è necessario specificare: gente del posto, è necessario specificare: parziale o: modello

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

    dovrebbe funzionare

    Per essere onesti, so solo su questi casi d’uso, perché ho seguito Rails negli ultimi due anni e ho letto gli annunci che un nuovo modo di farlo è stato aggiunto. Spesso faccio un errore in me stesso, ma di solito è facilmente corretto.

    È una di quelle parti dell’API di Rails che non è stata pensata a fondo, se me lo chiedi. Ha accumulato sempre più zucchero sintattico nel corso degli anni, senza deprecare alcuno dei vecchi comportamenti. Il metodo di rendering ha il diabete.

    Per renderlo ancora peggiore, il rendering si comporta diversamente nel controller e nella visualizzazione. Osservo anche il contenuto del primo argomento per vedere se si tratta di un file, modello, azione o parziale. Se inizia con una barra, allora è un file o qualcosa del genere.

    Sono favorevole all’utilizzo della notazione più breve quando ansible. Perché le notazioni brevi comunicano abbastanza bene l’intento. Quando lo leggi, di solito fa quello che pensi che faccia. Scrivere non è così semplice.

    Ecco la fonte del metodo di rendering da http://api.rubyonrails.org/classs/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 

    Spero che questo aiuto!