Rails: confus au sujet de la syntaxe pour passer les sections locales aux partiels

99

Comprendre la «magie» des Rails en ce qui concerne le rendu des partiels (et le passage des sections locales).

Pourquoi ça marche:

<%= render "rabbits/form" %>

Et ce travail:

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

mais cela ne fonctionne 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 pour ne pas avoir à déranger les gens sur SO?

Meltemi
la source
3
Dans un commentaire ci-dessous, vous disiez que les documents de l'API Rails ne peuvent pas être recherchés. Vous devriez plutôt essayer ce site: apidock.com/rails . Il contient également du rubis et du rspec.
ryeguy

Réponses:

152

La réponse courte est que la méthode de rendu examine le premier argument que vous passez. Si vous passez un hachage (qui inclut :partial => 'foo', :locals => {blah blah blah}), alors il passera tous vos arguments sous forme de hachage et les analysera en conséquence.

Si vous passez une chaîne comme premier argument, il suppose que le premier argument est votre nom partiel et transmettra le reste comme vos locaux. Cependant, dans cet appel suivant, il attribue en fait :locals => your_locals_argument, qui dans ce cas est le tout :locals => {locals hash}, au lieu de juste {locals hash}; c'est-à-dire que vous vous retrouvez avec :locals => {:locals => {locals hash}}, plutôt que :locals => {locals hash}.

Mon conseil est donc de toujours transmettre explicitement les valeurs de la même manière tout le temps, et vous n'aurez aucun problème. Pour en savoir plus, je suis allé directement au code lui-même ( actionpack / lib / base.rb , render()méthode dans Rails 2; Rails 3 est différent). C'est un bon exercice.

De plus, ne vous inquiétez pas de «déranger» les gens sur SO. C'est pourquoi ce site existe. J'ai même appris quelque chose de cela.

Doug R
la source
5

si vous devez spécifier: locaux, vous devez spécifier: partiel ou: modèle

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

devrait marcher

Sethvargo
la source
cela a à voir avec la façon dont ruby ​​évalue le hachage si vous êtes curieux de cette façon.
sethvargo
En effet, cela fonctionne ... comme je l'ai spécifié dans ma question ... mais ce que je me demande, c'est pourquoi? et où est-ce documenté? seulement en regardant la source? Et, si c'est le seul moyen de trouver et de comprendre ces myriades de nuances dans Rails, alors je me demande comment et aller pour localiser et interpréter cela à partir de la source. Je ne peux pas simplement cliquer sur "rendre" et ensuite explorer la source (pas avec TextMate de toute façon) ou puis-je?
Meltemi
1
ah! donc vous êtes vraiment intéressé :). Oui, la seule façon de comprendre ces choses est de a.) Avoir une intuition comme vous l'avez fait et b.) Afficher le code source. Je ne sais pas comment explorer la source cependant ... désolé
sethvargo
ok, je vais mordre ... comment vous regardez ce genre de choses? est-ce que vous fouillez simplement votre clone https://github.com/rails/rails.git? ou y a-t-il un meilleur moyen? Désolé mais je suis relativement nouveau pour RoR et n'ont pas encore trouvé un bon / moyen facile / cohérente pour consulter la documentation Rails ... tel qu'il EST tout. http://api.rubyonrails.org/n'est pas facilement consultable. et la source de git n'est pas non plus ... soupir
Meltemi
Je ne suis en aucun cas un expert, mais j'utilise le studio Aptana. Il est construit sur la même plate-forme qu'eclipse (si vous êtes familier). Il vous permet de "cliquer" et de tracer comme vous l'avez dit. Vous pouvez également faire une recherche dans le code et il a un terminal intégré, etc. Attention - c'est un fichier assez gros
sethvargo
2

Pour être honnête, je ne connais que ces cas d'utilisation, car je suis au courant de Rails depuis quelques années et j'ai lu les annonces selon lesquelles une nouvelle façon de faire a été ajoutée. Je fais souvent une erreur moi-même, mais généralement c'est facilement corrigé.

C'est l'une de ces parties de l'API Rails qui n'a pas été complètement réfléchie, si vous me le demandez. Il a juste accumulé de plus en plus de sucre syntaxique au fil des ans, sans déprécier aucun des anciens comportements. La méthode de rendu a le diabète.

Pour aggraver les choses, le rendu se comporte différemment dans le contrôleur et la vue. Je regarde également le contenu du premier argument pour voir s'il s'agit d'un fichier, d'un modèle, d'une action ou d'un partiel. Si cela commence par une barre oblique, c'est un fichier, ou quelque chose comme ça.

Je suis favorable à l'utilisation de la notation plus courte chaque fois que possible. Parce que les courtes notations communiquent assez bien l'intention. En le lisant, il fait généralement ce que vous pensez qu'il fait. L'écriture de partiels n'est pas simple.

iain
la source
1

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

Andrea Salicetti
la source
Cela aide , merci! Mais cela ne m'aide pas à m'aider moi-même ... si vous voyez ce que je veux dire ...
Meltemi