Duplicata possible:
Rails: confusion sur la syntaxe pour passer des locaux aux partiels
Je veux passer une variable locale (qui n'a pas de champ pertinent dans le modèle) à partial.
# infos/index.html.erb
<%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %>
: img_style sera de style html pour l'image.
# infos/_info.html.erb
<% first = @infos.shift %>
<%= image_tag(info.image.url, :class => img_style), info %>
# and here goes code for normal iteration
<% @infos.each do |e| %>
# etc
Mais cela ne fonctionne pas, il renvoie une erreur:
# GET /infos/
undefined local variable or method `img_style' for #<#<Class:0xc471f34>:0xc470cc4>
Cela peut-il être fait sans faire de partiels redondants?
Désolé pour mon anglais. : P
MODIFIER:
Eh bien, les informations sur le modèle n'ont pas: champ img_style
# db/schema.rb
create_table "infos", :force => true do |t|
t.string "title"
t.text "description"
t.integer "place_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "image_file_name"
t.string "image_content_type"
t.integer "image_file_size"
t.datetime "image_updated_at"
t.text "short"
end
EDIT2:
Même simple
<%= img_style %>
ne fonctionne pas.
Trace de pile d'application
app/views/infos/_info.html.erb:3:in `_app_views_infos__info_html_erb___1029249744_92158380_1472718'
app/views/infos/index.html.erb:7:in `_app_views_infos_index_html_erb__184644561_92172050_0'
app/controllers/infos_controller.rb:8:in `index'
EDIT3:
Vues
# infos/index.html.erb
<div >
<h1><%= t('info.infos') %></h1>
<div id="left">
<% first = @infos.shift %>
<div>
<% @aimg_style = "original"%>
<%= render 'info', :locals => {@img_style => @aimg_style } %>
</div>
<ul>
<% @infos.each do |e| %>
<li>
<div>
<%= render :partial => 'info', :object => e %>
</div>
</li>
<% end %>
</ul>
<%= will_paginate @infos %>
# infos/_info.html.erb
<%#= link_to thumbnail(info, "listTabsImg", false, img_style), info %>
<%#= image_tag(info.image.url()) %>
<%= img_style %>
<p>
<strong class="nameBox"><%= link_to info.title, info %></strong>
<span><%= info.short %>...</span>
<%= link_to "#{t('more')} »", info %>
</p>
[~ # ~] enfin [~ # ~]
Cela ne fonctionne pas:
# infos/index.html.erb
<% first = @infos.shift %>
<div class="boxEvent">
<% @aimg_style = "original"%>
<%= first %>
<%= render 'info', :locals => {:info => first, :img_style => @aimg_style } %>
</div>
Cela marche:
# infos/index.html.erb
<% @infos.each do |e| %>
<li>
<div class="boxEvent">
<%= render :partial => 'info', :locals => {:info => e, :img_style => "original"} %>
</div>
</li>
<% end %>
Quelqu'un sait pourquoi?
J'utilise en fait cette syntaxe dans Rails 3:
render "a_partial", :a_local_variable => whatever, :another_variable => another
Cela devrait fonctionner:
<%= render :partial => "info", :locals => { :img_style => "original" } %>
Avec ce partiel:
# infos/_info.html.erb
<%= image_tag(info.image.url, :class => img_style), info %>
Cependant, si vous appelez le faux partiel, essayez ceci comme partiel:
# infos/_info.html.erb
<%= image_tag(info.image.url(img_style)), info %>
J'ai passé plusieurs heures là-dessus; en vue, render :partial => ? , :locals => (....}
il semble que si vous appelez pour la première fois:
render :partial => ? without a locals hash
et ALORS appelez render :partial => ?
avec un hachage local, le hachage local IS NON transmis à la vue.
Si le premier appel inclut un hachage local avec les mêmes variables définies sur ''
alors le deuxième appel avec des valeurs REELLES fonctionnera.
Votre code (celui que vous avez indiqué sur la première ligne) devrait fonctionner. Il n'y a pas d'erreur. Je l'ai même testé moi-même et cela fonctionne pour moi.
Les raisons habituelles de telles erreurs sont:
Le fait que votre modèle ne possède pas l'attribut "img_style" n'est pas important.
Je peux le voir dans votre infos/index.html.erb
vous avez deux endroits où vous appelez render :partial => 'info', :object => ...
et vous n'avez pas: des locaux ici. Seuls les numéros de ligne ne correspondent pas à la trace de pile que vous avez publiée précédemment, il est donc difficile de dire quel appel est à l'origine du problème.
Je suppose que les deux appels à la méthode render
nécessitent des corrections.
Dans le premier, soyez précis et appelez render :partial => "info"
au lieu de render "info"
. Cela peut être un bogue dans Rails, mais pour une raison étrange, les habitants semblent ne pas être passés à la vue dans ce cas.
Dans le deuxième appel à render
ajoutez simplement: local.
Je crois que le problème est la fuite , info
appel. Il recherche dans l'objet info
pour img_style
. Vous n'en avez pas besoin.
J'adore utiliser des partiels, mais j'ai récemment vu la beauté des méthodes d'assistance, en particulier dans les rendus simples comme celui-ci.
def info_image(info, class_name="original")
image_tag(info.image.url, :class => class_name)
end
alors juste
<%= info_image(first) %>
ou
<%= info_image(first, "anotherclass") %>
dans la vue. Beaucoup plus propre.
Si jamais cela devient plus complexe. Vous n'aurez qu'à changer le code en un seul endroit.