使用rails中的某些变量渲染视图

时间:2014-02-18 14:18:28

标签: ruby-on-rails

我有一个控制器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: &euro;<%=@donation%></p>

当我尝试在任何其他视图中进行渲染时(例如static/index.html.erb - 我的网站主页),它将在没有变量的情况下呈现。这是我使用的代码

...
<%=render partial: "donations/index", donation: @donation, donation_percent: @donation_percent%>
...

我该怎么做才能渲染变量?谢谢。

3 个答案:

答案 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: &euro;<%= donation %></p>

答案 2 :(得分:0)

您不必手动渲染布局中的部分内容。将<%= yield %>放在partial应该的位置,Rails将处理选择并为当前操作呈现正确的模板。

关于您的原始问题 - 要从另一个模板中提取一个模板,请使用render partial,而不是render template

可以在官方Rails guide中找到进一步的说明。