Rails 3,将局部变量传递给partial

时间:2011-06-08 13:42:31

标签: ruby-on-rails ruby-on-rails-3 partial locals

  

可能重复:
  Rails: confused about syntax for passing locals to partials

我想将局部变量(模型中没有相关字段)传递给partial。

# 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

修改

井模型信息没有: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 个答案:

答案 0 :(得分:50)

我实际上只是在Rails 3中使用这种语法:

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

答案 1 :(得分:12)

这应该有效:

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

答案 2 :(得分:5)

我花了几个小时的时间;在一个视图中,  render :partial => ? , :locals => (....} 看来如果你第一次打电话:

render :partial => ? without a locals hash

然后使用本地哈希调用渲染:partial => ?本地哈希不会传递给视图。

如果第一个调用包含一个locals哈希,其相同的变量设置为'' 那么用REAL值进行的第二次调用就可以了。

答案 3 :(得分:2)

您的代码(您在第一行显示的代码)应该可以使用。没有错误。我甚至自己测试过,它对我有用。

此类错误的常见原因是:

  • 拼写错误的变量名称
  • 也从其他地方调用部分地方,你没有通过:local。

您的模型没有属性“img_style”的事实并不重要。

我可以看到,在infos/index.html.erb你有两个地方,你打电话给render :partial => 'info', :object => ...而你没有:本地人。只是行号与您之前发布的堆栈跟踪不匹配,因此很难说哪个调用会导致问题。

我想两次调用render方法都需要更正。

在第一个中,具体而言,请致电render :partial => "info"而不是render "info"。这可能是Rails中的一个错误,但由于一些奇怪的原因,在这种情况下,本地似乎没有传递给视图。

在第二次调用render时,只需添加:locals。

答案 4 :(得分:1)

我认为问题是跟踪, 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") %>

{{1}}
在视图中

。更干净。

如果它变得更复杂。您只需在一个地方更改代码。