2011-06-08 69 views
26

Possible Duplicate:
Rails: confused about syntax for passing locals to partialsRails 3中,传递局部变量来局部

欲局部变量(其不具有在模型相关领域)传递给部分。

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

FINALLY

这不作品:

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

有人知道为什么吗?

+0

哪行代码在哪个文件中? '<%= image_tag'是否放置在'_info'部分或其他地方?当第一个示例调用partial或者从其他地方调用它时,该错误是否会引发?我问你是因为你提到了多余的部分,但你没有说过你从多个地方叫出部分。 – Arsen7 2011-06-08 14:09:50

+0

这可能不算什么 - 因为你的问题已经包含了正确的代码 - 但是使用简写语法会导致失败:'render'info',:locals => {...}'。如果你明确地调用partial,'render:partial =>'info',:locals => {...}',那么我看不出有什么理由不起作用。正如@Arsen7所建议的那样,知道你的部分是如何嵌套在你的模板中是很有帮助的。 – neezer 2011-06-08 14:23:50

+0

@ Arsen7当我从浏览器中获得信息时,会引发错误。我想这样做没有redunant partials(每个部分的每个样式,例如:_info_small.html.erb,_info_original.html.erb等) – 2011-06-08 15:03:12

回答

50

其实我只是用在Rails 3中的语法:

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

嗯..这个语法也不行'未定义的局部变量或方法'img_style'为#<#:0xb474978>' – 2011-06-08 14:56:48

+1

它应该工作得很好。变量必须从其他范围内访问。 – d11wtq 2011-06-08 15:02:30

+0

如果它仍然不适合你 - 可能你的部分被缓存。要检查是否在部分开始处添加任何垃圾(例如一行'lalala'),并检查此时是否将值传递给部分。 – Alexander 2014-01-28 18:15:03

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

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

通常的原因这样的错误是:

  • 拼写错误的变量名
  • 调用部分也从其他地方,在那里你没有传递:本地。

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

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

我想这两个调用render方法需要更正。

在第一个,具体的,并呼吁render :partial => "info",而不是render "info"。这可能是Rails中的一个错误,但出于某种奇怪的原因:在这种情况下,本地人似乎不会传递给视图。

在第二次电话render只需添加:locals。

1

我相信问题是尾随, info调用。它正在寻找info对象img_style。你不需要它。

我喜欢使用partials,但最近也看到了辅助方法中的美,特别是在像这样的简单渲染中。

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

然后只是

<%= info_image(first) %> 

<%= info_image(first, "anotherclass") %> 
在视图

。更干净。

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

5

我在这上面花了好几个小时,在视图中, render :partial => ? , :locals => (....} 看来,如果你第一次调用:

render :partial => ? without a locals hash 

,然后调用渲染:partial => ?与当地人哈希散列当地人没有传递到视图。

如果第一次调用包含一个设置为'' 的变量相同的本地哈希,则第二次调用REAL值将会起作用。

+3

这不是一个错误,它是一个功能。 :) – 2012-03-01 09:03:46

+0

这听起来像你说第一次调用'渲染器'可以打破后续调用'render'。我从来没有经历过这种行为。你能否阐述或澄清?谢谢。 – Nathan 2012-09-11 00:47:56

+0

这确实是一个非常简单的“功能”。如果你有一个'partial'请求'foo',那么调用'render partial'而不传递'foo'的值会导致一个未定义的变量错误。所以代码不会在你传递变量的地方打破,而是在你不通过它的地方*。顺便说一句,如果你真的想要一个'可选'本地的,在部分中用'defined?'来保护它,像这样:'foo if defined? foo'。 – 2015-02-09 18:02:35