with render_to_string rails from ruby-on-rails ruby-on-rails-3 partial locals

ruby on rails - render_to_string - Rails 3, pasando la variable local a parcial



render json rails (5)

Posible duplicado:
Rails: confundido acerca de la sintaxis para pasar de locales a parciales

Quiero pasar la variable local (que no tiene un campo relevante en el modelo) a parcial.

# infos/index.html.erb <%= render :partial => ''info'', :locals => {:info => first, :img_style => "original"} %>

: img_style será el 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 no funciona, devuelve 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 ingles. :PAG

EDITAR:

Bueno, la información del modelo no tiene: campo 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 simple

<%= img_style %>

no funciona

Aplicación Stack Trace

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:

Puntos de vista

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


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

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

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

entonces solo

<%= 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.


De hecho, solo uso esta sintaxis en Rails 3:

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


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 está llamando incorrectamente parcial, intente esto como parcial:

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


He pasado varias horas en esto; en una vista, render :partial => ? , :locals => (....} render :partial => ? , :locals => (....} parece que si primero llamas:

render :partial => ? without a locals hash

y ENTONCES llamada render :partial => ? con un hash local, el hash local NO se pasa a la vista.

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


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 de tales errores son:

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

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

Puedo ver que en tu infos/index.html.erb tienes dos lugares donde llamas render :partial => ''info'', :object => ... y no tienes: locals aquí. Solo los números de línea no coinciden con el seguimiento de pila que ha publicado anteriormente, por lo que es difícil decir qué llamada causa el problema.

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

En la primera, sea específico y llame a render :partial => "info" lugar de render "info" . Esto puede ser un error en Rails, pero por alguna extraña razón, los locales no parecen pasar a la vista en este caso.

En la segunda llamada para render solo agregue: locals.