2011-06-08 21 views
26

Possible Duplicate:
Rails: confused about syntax for passing locals to partialsRails 3, pasando variable local a parcial

I quieren pasar variable local (que no tiene campo correspondiente en el modelo) a parcial.

# infos/index.html.erb 

<%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %> 

: img_style será estilo html para la imagen.

# 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 

Pero esto no funciona, se devuelve el error:

# GET /infos/ 
undefined local variable or method `img_style' for #<#<Class:0xc471f34>:0xc470cc4> 

Se puede hacer sin hacer parciales redundantes?

Lo siento por mi inglés. : P

EDIT:

Bueno Info modelo no tienen: Campo de 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:

Incluso sencilla

<%= img_style %> 

Don' t trabajos.

Aplicación Seguimiento de la pila

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:

Vistas

# 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> 

FINALMENTE

esto no funciona:

# infos/index.html.erb 
<% first = @infos.shift %> 
<div class="boxEvent"> 
    <% @aimg_style = "original"%> 
    <%= first %> 
    <%= render 'info', :locals => {:info => first, :img_style => @aimg_style } %> 
</div> 

esto funciona:

# infos/index.html.erb 
    <% @infos.each do |e| %> 
    <li> 
     <div class="boxEvent"> 
     <%= render :partial => 'info', :locals => {:info => e, :img_style => "original"} %> 
     </div> 
    </li> 
    <% end %> 

Alguien sabe por qué?

+0

¿Qué línea de código está en qué archivo? ¿Está el '<% = image_tag' colocado en el' _info' parcial, o en otro lugar? ¿El error aumenta cuando el primer ejemplo invoca el parcial o lo llamas desde otro lugar? Lo pregunto porque mencionó los parciales redundantes, pero no ha dicho que llame al parcial desde más de un lugar. – Arsen7

+0

Esto puede no ser nada, ya que su pregunta ya incluye el código correcto, pero usar la sintaxis abreviada causará este error: 'render 'info',: locals => {...}'. Si está llamando explícitamente al parcial, 'render: partial => 'info',: locals => {...}', entonces no veo ningún motivo por el que esto no funcione. Como sugirió @ Arsen7, sería útil saber cómo anidan sus parciales en su plantilla. – neezer

+0

@ Arsen7 El error se produce cuando yo/infos del navegador. Quería hacer eso sin parciales redundantes (cada uno parcial para cada estilo, por ejemplo: _info_small.html.erb, _info_original.html.erb, etc.) –

Respuesta

50

que en realidad sólo tiene que utilizar esta sintaxis en Rails 3:

render "a_partial", :a_local_variable => whatever, :another_variable => another 
+7

Bueno ... esta sintaxis tampoco funciona 'variable local indefinida o método 'img_style' para # <# : 0xb474978>' –

+1

Debería funcionar bien. Se debe acceder a la variable desde algún otro ámbito. – d11wtq

+0

Si aún así no funciona para usted, probablemente su parte se almacena en caché. Para verificar que agregue cualquier basura (por ejemplo, una línea 'lalala') al comienzo de su parcial y verifique si esta vez el valor se pasa al parcial. – Alexander

12

esto debería funcionar:

<%= render :partial => "info", :locals => { :img_style => "original" } %> 

Con este parcial:

# infos/_info.html.erb 
<%= image_tag(info.image.url, :class => img_style), info %> 

Sin embargo, si usted está llamando la parcial mal entonces intente esto como el parcial:

# infos/_info.html.erb 
<%= image_tag(info.image.url(img_style)), info %> 
2

Su código (el que ha mostrado en la primera línea) debería funcionar. No hay error Incluso lo he probado yo mismo y funciona para mí.

Las razones habituales para este tipo de errores son:

  • mal escrito nombre de la variable
  • llamando al parcial también de algún otro lugar, donde no pasa un: local.

El hecho de que su modelo no tenga el atributo "img_style" no es importante.

Veo que en su infos/index.html.erb tiene dos lugares donde llama al render :partial => 'info', :object => ... y no tiene: locales aquí. Solo los números de línea no coinciden con la pila que ha publicado anteriormente, por lo que es difícil decir qué llamada causa el problema.

Supongo que ambas llamadas al método render necesitan correcciones.

En el primero, sea específico y llame al render :partial => "info" en lugar de render "info". Esto puede ser un error en Rails, pero por alguna extraña razón, los lugareños no se pasan a la vista en este caso.

En la segunda llamada al render solo agregue los locales.

1

Creo que el problema es la llamada final , info. Está buscando en el objeto info para img_style. No lo necesitas.

Me encanta usar parciales pero recientemente he visto la belleza en los métodos de ayuda también, especialmente en representaciones simples como esta.

def info_image(info, class_name="original") 
    image_tag(info.image.url, :class => class_name) 
end 

a continuación, sólo

<%= info_image(first) %> 

o

<%= info_image(first, "anotherclass") %> 

en la vista. Mucho más limpio.

Si alguna vez se vuelve más complejo. Solo tendrás que cambiar el código en un solo lugar.

5

He pasado varias horas en esto; en una vista, render :partial => ? , :locals => (....} parece si la primera llamada:

render :partial => ? without a locals hash 

y luego llamar a render :partial => ? con una gente hash del hash de los locales no se pasa a la vista.

Si la primera llamada incluye un hash local con las mismas variables establecidas en '' , entonces la segunda llamada con valores REALES funcionará.

+3

No es un error, es una característica. :) –

+0

Parece que estás diciendo que una primera llamada a 'render' puede romper una llamada subsiguiente a' render'. Nunca he experimentado este comportamiento. ¿Podrías elaborar o aclarar? Gracias. – Nathan

+0

Esta es de hecho una "característica" muy simple. Si tiene un 'partial' que pide' foo', entonces llamar 'render partial' sin pasar un valor para' foo' dará como resultado un error variable indefinido. Entonces el código no se rompe en el lugar donde pasa la variable, pero en el lugar * no la pasa *. Por cierto, si * realmente * quieres tener un local 'opcional', guárdalo con 'defined?' En el parcial, así: 'foo if defined? foo'. –

Cuestiones relacionadas