我有一个控制器donations_controller
class DonationsController < ApplicationController
def index
donation = Donation.find_by_id(1).donation
donation_percent = donation.to_f/50*100
end
end
和视图donations/_index.html.erb
<div class="progress">
<div class="bar" style="width:<%=@donation_percent%>%;"></div>
</div>
<p>Donated: €<%=@donation%></p>
当我尝试在任何其他视图中进行渲染时(例如static/index.html.erb
- 我的网站主页),它将在没有变量的情况下呈现。这是我使用的代码
...
<%=render partial: "donations/index", donation: @donation, donation_percent: @donation_percent%>
...
我该怎么做才能渲染变量?谢谢。
答案 0 :(得分:1)
无法访问@donation,因为除了捐赠#index动作(假设)之外没有定义它。
您有两种选择 1)您可以将代码放在您想要访问捐赠的任何地方
@donation = Donation.find_by_id(1).donation
@donation_percent = @donation.to_f/50*100
2)或者将模板声明为部分模板,而不是将模板渲染渲染为部分模板,并将文件重命名为“_index.html.haml”
渲染部分:'捐赠/索引',捐赠:@donation
将变量名称从@donation更改为捐赠
答案 1 :(得分:1)
您需要将要在视图中访问的控制器的值放入实例变量中,因此:
class DonationsController < ApplicationController
def index
@donation = Donation.find_by_id(1).donation
@donation_percent = @donation.to_f/50*100
end
end
接下来,您的index
视图几乎是正确的,您将这些实例变量作为本地传递给部分(但忘记将它们包装在本地散列中):
...
<%=render partial: "donations/index", locals: {donation: @donation, donation_percent: @donation_percent} %>
...
但是在局部你应该把它们称为局部变量
<div class="progress">
<div class="bar" style="width:<%= donation_percent %>%;"></div>
</div>
<p>Donated: €<%= donation %></p>
答案 2 :(得分:0)
您不必手动渲染布局中的部分内容。将<%= yield %>
放在partial应该的位置,Rails将处理选择并为当前操作呈现正确的模板。
关于您的原始问题 - 要从另一个模板中提取一个模板,请使用render partial
,而不是render template
。
可以在官方Rails guide中找到进一步的说明。