可能的重复项:
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
编辑:
井模型信息没有: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
编辑2:
甚至简单
<%= 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'
编辑3:
视图
# 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 %>
有人知道为什么吗?
我实际上只是在 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 => ?
,局部变量哈希不会传递到视图。
如果第一次调用包含具有相同变量设置为 ''
的局部哈希然后,具有 REAL 值的第二次调用将起作用。
您的代码(您在第一行中显示的代码(应该可以工作。没有错误。我什至自己测试过它,它对我有用。
此类错误的常见原因是:
- 变量名拼写错误
- 也从其他地方调用部分,在那里您不传递 :local。
模型没有属性"img_style"这一事实并不重要。
我可以看到,在你的infos/index.html.erb
中,你有两个地方可以打电话给render :partial => 'info', :object => ...
,而你这里没有:locals。只是行号与您之前发布的堆栈跟踪不匹配,因此很难说哪个调用导致问题。
我想对render
方法的两个调用都需要更正。
在第一个中,要具体,并调用render :partial => "info"
而不是render "info"
。这可能是 Rails 中的一个错误,但由于某种奇怪的原因,在这种情况下,:locals 似乎没有传递给视图。
在对render
的第二次调用中,只需添加 :locals。
问题是尾随, 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") %>
在视图中。 干净多了。
如果它变得更复杂。 您只需在一个位置更改代码。