Подтвердить что ты не робот

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>

Это можно сделать, не делая лишних партитур?

Извините за мой английский.: P

EDIT:

Модель модели не имеет: img_style field

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

Кто-нибудь знает, почему?

4b9b3361

Ответ 1

Я просто использую этот синтаксис в Rails 3:

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

Ответ 2

Это должно работать:

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

Ответ 3

Я потратил несколько часов на это; в представлении,  render :partial => ? , :locals => (....} кажется, если вы сначала позвоните:

render :partial => ? without a locals hash

и THEN вызывать render :partial => ? с помощью хэша locals, хеш locals не передается в представление.

Если первый вызов включает хеш локалей с теми же переменными, установленными на '' то второй вызов с РЕАЛЬНЫМИ значениями будет работать.

Ответ 4

Ваш код (тот, который вы показали в первой строке) должен работать. Ошибок нет. Я даже проверил его сам, и он работает для меня.

Обычными причинами таких ошибок являются:

  • имя переменной с ошибкой
  • вызов частичного из другого места, где вы не передаете: local.

Тот факт, что ваша модель не имеет атрибута "img_style", не имеет значения.

Я вижу, что в вашем infos/index.html.erb у вас есть два места, где вы вызываете render :partial => 'info', :object => ..., и у вас нет: locals здесь. Просто номера строк не совпадают с выложенным ранее стеклом, поэтому трудно сказать, какой вызов вызывает проблему.

Я думаю, что оба вызова метода render нуждаются в исправлениях.

В первом, будьте конкретными и вызовите render :partial => "info" вместо render "info". Это может быть ошибка в Rails, но по какой-то странной причине: locals, кажется, не передаются в представление в этом случае.

Во втором вызове render просто добавьте: locals.

Ответ 5

Я считаю, что проблема связана с завершающим вызовом , 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") %>

в представлении. Гораздо чище.

Если когда-либо это становится более сложным. Вам нужно будет только изменить код в одном месте.