98 votes

Rails: confus quant à la syntaxe pour passer des locaux à des partiels

Comprendre la "magie" de Rails en ce qui concerne le rendu des partiels (et l’adoption de la population locale).

Pourquoi ça marche:

 <%= render "rabbits/form" %>
 

Et ce travail:

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

mais ça ne marche pas :

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

Mais cela fait:

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

Aussi, comment puis-je rechercher ces nuances afin de ne pas déranger les gens sur SO?

153voto

Doug R Points 4034

La réponse courte est la méthode render regarde le premier argument que vous transmettez. Si vous passez dans une table de hachage (qui inclut :partial => 'foo', :locals => {blah blah blah}) puis il va passer dans tous vos arguments d'un algorithme de hachage et de les interpréter en conséquence.

Si vous passez une chaîne de caractères en tant que votre premier argument, il suppose que le premier argument est votre nom partiel, et va passer le reste de vos locaux. Cependant, dans cet appel, il attribue en fait :locals => your_locals_argument, qui dans ce cas est l'ensemble de l' :locals => {locals hash}, au lieu de simplement en {locals hash}; c'est à dire, vous vous retrouvez avec :locals => {:locals => {locals hash}}, plutôt que d' :locals => {locals hash}.

Donc, mon conseil est de ne pas transmettre explicitement les valeurs de la même manière tout le temps, et vous n'aurez pas de problèmes. Afin d'apprendre à ce sujet, je suis allé directement sur le code lui-même (actionpack/lib/base.rb, render() méthode de Rails 2; Rails 3 est différent). C'est un bon exercice.

En outre, ne vous inquiétez pas "déranger" les gens sur. C'est pourquoi ce site existe. J'ai même appris quelque chose de cela.

5voto

sethvargo Points 10560

Si vous devez spécifier: locals, vous devez également spécifier: partial

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

devrait marcher

2voto

iain Points 11602

Pour être honost, je ne sais à propos de ces cas d'utilisation, parce que j'ai suivi avec des Rails pour les deux dernières années et lire les annonces d'une nouvelle façon de faire a été ajouté. Je fais souvent une erreur en moi-même, mais en général c'est facile à rectifier.

C'est une de ces pièces de Rails API qui n'a pas été entièrement été pensé pour vous, si vous me demandez. Il accumulé plus et plus de sucre syntaxique au fil des ans, sans autodérision tout de l'ancien comportement. La méthode render a le diabète.

Pour le rendre encore pire, le rendu se comporte différemment dans le contrôleur et la vue. Je regarde aussi le premier argument de contenu pour voir si c'est un fichier, d'un modèle d'action ou partielle. Si elle commence par une barre oblique, puis c'est un fichier, ou quelque chose comme ça.

Je suis en faveur de l'utilisation de la notation plus courte possible. Parce que le court notations faire communiquer l'intention tout à fait bien. Lors de la lecture, il n'est généralement ce que vous pensez que cela fonctionne. L'écriture n'est pas simple.

1voto

Andrea Salicetti Points 649

Voici la source de la méthode de rendu à partir de 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
 

J'espère que cette aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X