web-dev-qa-db-fra.com

Rails 3, passage d'une variable locale à une partie

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?

26

J'utilise en fait cette syntaxe dans Rails 3:

render "a_partial", :a_local_variable => whatever, :another_variable => another
50
d11wtq

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 %>
12
Devin M

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.

5
John

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:

  • nom de variable mal orthographié
  • appeler le partiel aussi d'un autre endroit, où vous ne passez pas a: local.

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.

2
Arsen7

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.

1
natedavisolds