Rails 3, передавая локальную переменную в частичное
Возможный дубликат:
Rails: запутался в синтаксисе для передачи локальных данных в партиалы
Я хочу передать локальную переменную (которая не имеет соответствующего поля в модели) к частичной.
# infos/index.html.erb
<%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %>
: img_style будет HTML-стиль для изображения.
# 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
Но это не работает, это возвращает ошибку:
# GET /infos/
undefined local variable or method `img_style' for #<#<Class:0xc471f34>:0xc470cc4>
Это можно сделать без лишних частичек?
Извините за мой английский.:П
РЕДАКТИРОВАТЬ:
Ну, информация о модели не имеет: поле 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:
Даже просто
<%= img_style %>
не работает
Трассировка стека приложений
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:
Просмотры
# 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>
В КОНЦЕ КОНЦОВ
Это не работает:
# infos/index.html.erb
<% first = @infos.shift %>
<div class="boxEvent">
<% @aimg_style = "original"%>
<%= first %>
<%= render 'info', :locals => {:info => first, :img_style => @aimg_style } %>
</div>
Это работает:
# infos/index.html.erb
<% @infos.each do |e| %>
<li>
<div class="boxEvent">
<%= render :partial => 'info', :locals => {:info => e, :img_style => "original"} %>
</div>
</li>
<% end %>
Кто-нибудь знает почему?
5 ответов
Я на самом деле просто использую этот синтаксис в Rails 3:
render "a_partial", :a_local_variable => whatever, :another_variable => another
Это должно работать:
<%= render :partial => "info", :locals => { :img_style => "original" } %>
С этим частичным:
# infos/_info.html.erb
<%= image_tag(info.image.url, :class => img_style), info %>
Однако, если вы называете частичное неправильно, попробуйте это как частичное:
# infos/_info.html.erb
<%= image_tag(info.image.url(img_style)), info %>
Я провел несколько часов на этом; в представлении, render :partial => ? , :locals => (....}
кажется, если вы сначала позвоните:
render :partial => ? without a locals hash
и затем вызов сделать :partial => ?
с хешем местных жителей хеш не передается в представление.
Если первый вызов включает хеш-код localals с такими же переменными, установленными в ''
тогда будет работать второй вызов с РЕАЛЬНЫМИ значениями.
Ваш код (тот, который вы показали в первой строке) должен работать. Там нет ошибки. Я даже проверил это сам, и это работает для меня.
Обычные причины таких ошибок:
- имя переменной с ошибкой
- вызов частичного также из другого места, где вы не передаете: local.
Тот факт, что ваша модель не имеет атрибута img_style, не имеет значения.
Я вижу это в вашем infos/index.html.erb
у вас есть два места, где вы звоните render :partial => 'info', :object => ...
а у вас нет: здесь местные жители. Только номера строк не совпадают с трассировкой стека, которую вы опубликовали ранее, поэтому трудно сказать, какой вызов вызывает проблему.
Я думаю, что оба звонка на render
Метод нуждается в исправлениях.
В первом, будьте конкретны и звоните render :partial => "info"
вместо render "info"
, Это может быть ошибкой в Rails, но по какой-то странной причине: кажется, что в этом случае местные жители не передаются в представление.
Во втором звонке render
просто добавьте: местные жители.
Я считаю, что проблема в том, , info
вызов. Это смотрит в info
объект для img_style
, Тебе это не нужно.
Мне нравится использовать партиалы, но недавно я видел красоту и в вспомогательных методах, особенно в таких простых рендерингах, как этот.
def info_image(info, class_name="original")
image_tag(info.image.url, :class => class_name)
end
тогда просто
<%= info_image(first) %>
или же
<%= info_image(first, "anotherclass") %>
в представлении. Гораздо чище.
Если когда-либо это становится более сложным. Вам нужно будет только изменить код в одном месте.