Ruby on rails Rails 3,将局部变量传递给局部变量
可能重复:Ruby on rails Rails 3,将局部变量传递给局部变量,ruby-on-rails,ruby-on-rails-3,partial,locals,Ruby On Rails,Ruby On Rails 3,Partial,Locals,可能重复: 我想把局部变量(模型中没有相关字段)传递给partial # infos/index.html.erb <%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %> EDIT2: 甚至简单 <%= img_style %> EDIT3: 观点 #infos/index.html.erb {@img_style=>@
我想把局部变量(模型中没有相关字段)传递给partial
# infos/index.html.erb
<%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %>
EDIT2:
甚至简单
<%= img_style %>
EDIT3:
观点
#infos/index.html.erb
{@img_style=>@aimg_style}%>
-
'信息',:对象=>e%>
#infos/_info.html.erb
...
最后
这不起作用:
# 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
{:info=>first,:img_style=>@aimg_style}%>
这项工作:
# infos/index.html.erb
<% @infos.each do |e| %>
<li>
<div class="boxEvent">
<%= render :partial => 'info', :locals => {:info => e, :img_style => "original"} %>
</div>
</li>
<% end %>
#infos/index.html.erb
'info',:locals=>{:info=>e,:img_style=>“original”}%>
有人知道为什么吗?我实际上只是在Rails 3中使用了以下语法:
render "a_partial", :a_local_variable => whatever, :another_variable => another
这应该起作用:
<%= render :partial => "info", :locals => { :img_style => "original" } %>
“info”,:locals=>{:img_style=>“original”}%>
有了这一部分:
# infos/_info.html.erb
<%= image_tag(info.image.url, :class => img_style), info %>
#infos/_info.html.erb
img_风格),信息%>
但是,如果您将部分调用错误,请尝试将此作为部分调用:
# infos/_info.html.erb
<%= image_tag(info.image.url(img_style)), info %>
#infos/_info.html.erb
您的代码(您在第一行中显示的代码)应该可以工作。没有错误。我甚至亲自测试过它,它对我很有效
此类错误的常见原因如下:
- 拼写错误的变量名
- 也可以从其他地方调用partial,在那里您没有传递a:local
infos/index.html.erb
中看到,你有两个地方可以调用render:partial=>'info',:object=>…
,而这里没有:locals。只是行号与您之前发布的stacktrace不匹配,所以很难说是哪个调用导致了问题
我想对render
方法的两个调用都需要更正
在第一个示例中,请指定,并调用render:partial=>“info”
,而不是render“info”
。这可能是Rails中的一个bug,但出于某种奇怪的原因:在本例中,本地代码似乎没有传递给视图
在对
render
的第二次调用中,只需添加:locals。我认为问题在于后面的,info
调用。它正在info
对象中查找img\u样式
。你不需要它
我喜欢使用partials,但最近也看到了helper方法的美妙之处,尤其是像这样的简单渲染
def info_image(info, class_name="original")
image_tag(info.image.url, :class => class_name)
end
那就
<%= info_image(first) %>
或
在视图中。干净多了
如果它变得更复杂的话。您只需在一个地方更改代码。我在这方面花了几个小时;从某种意义上说,,
render:partial=>?,:局部变量=>(..}
如果你第一次打电话:
render :partial => ? without a locals hash
然后使用局部散列调用render:partial=>?
,局部散列不会传递给视图
如果第一个调用包含一个本地散列,其变量设置为'
然后第二个调用将使用实际值。哪一行代码在哪一个文件中?是
吗?这可能没什么-因为您的问题已经包含了正确的代码-但是使用速记语法将导致此失败:呈现“info”,:locals=>{…}
。如果显式调用分部函数,render:partial=>'info',:locals=>{…}
,那么我看不出这不起作用的任何原因。正如@Arsen7所建议的,了解您的分区如何嵌套在模板中会很有帮助。@Arsen7错误是在从浏览器输入/输入信息时引发的。我想在不使用重复的分区的情况下执行此操作(每个分区对应于每个样式,例如:_info_small.html.erb、_info_original.html.erb等)您的模型不需要img_样式的字段。您在调用分部时定义它。如果现在的问题是“为什么?”那么我会说这是Rails中的一个缺陷。但通常在编程中,尽可能具体是好的。猜测和魔术通常会导致挫败。如果我想渲染分部,那么我应该明确地说。在这里遵守那条规则会意外地救你的。。这种语法也不适用于未定义的局部变量或方法'img#u style'
它应该可以正常工作。必须从其他范围内访问该变量。如果它仍然不适用于您,则可能缓存了部分变量。要检查是否在分部的开头添加任何垃圾(例如一行“lalala”),并检查这次是否将该值传递给分部。这不是错误,而是功能。:)听起来像是说对render
的第一次调用会中断对render
的后续调用。我从未经历过这种行为。你能详细说明或澄清一下吗?谢谢。这确实是一个非常简单的“特性”。如果您的partial
请求foo
,则调用render partial
而不传递foo
的值将导致未定义的变量错误。因此,代码不是在传递变量的地方中断的,而是在不传递变量的地方中断的。顺便说一句,如果你真的想有一个“可选”的局部变量,在部分中用defined?
来保护它,就像这样:foo if defined?foo
。
<%= 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 %>
def info_image(info, class_name="original")
image_tag(info.image.url, :class => class_name)
end
<%= info_image(first) %>
<%= info_image(first, "anotherclass") %>
render :partial => ? without a locals hash