我正在学习铁轨并且碰到了碰撞。
我有一个包含以下内容的视图:
<span><%= @goals.cost_per_conversion %></span>
(仅作为示例,而@goals
实际上包含更多只是cost_per_conversion)
在某些情况下,视图不会包含实例变量@goals
。我想在这种情况下防范案件。
在我的控制器中,我有以下代码:
if Goal.exists?(params[:id])
@goals = Goal.find(params[:id])
else
@goals.cost_per_conversion = 'N/A'
end
当然,这会返回错误,因为.conversions
不是方法。
如何设置转化参数,以便在没有@goals
变量可用时,我的视图仍然有效。
答案 0 :(得分:3)
使用#try
:
<span><%= @goals.try(:cost_per_conversion) %></span>
更改控制器代码:
@goals = Goal.find(params[:id])
控制器中的双重检查记录很昂贵。顺便说一句,因为它是单个记录,你可以将其命名为@goal
而不是@goals
。
答案 1 :(得分:1)
您可以使用if
:
<% if @goals %>
<span><%= @goals.cost_per_conversion %></span>
<% end %>
并将控制器代码更改为:
if Goal.exists?(params[:id])
@goals = Goal.find(params[:id])
end
或
if params[:id]
@goals = Goal.find(params[:id])
end
答案 2 :(得分:0)
如果在数据库中找不到目标,您可以考虑使用@goals = Goal.new
创建新的Goal对象。或者你可以在null object pattern之后创建一个像目标一样的空对象。
这只是接近它的两种方式,并不一定比其他答案更好。
顺便说一下,由于您的实例变量只包含一个目标而不是目标集合,因此应将其命名为@goal
。