我有一个代码,我需要退出(php版本的die),如果发生某些事件
trace_controller.rb中的代码段
def show
rule=Rule.new
@order,@order_error=rule.get_order(@order_external_id)
@order_items, @order_items_error=rule.get_order_items(@order)
@order_item_units, @order_item_units_error=rule.get_order_item_units(@order_items)
@outbound_messages, @outbound_messages_error = rule.check_outbound_messages(@order_external_id)
@inbound_messages, @inbound_messages_error = rule.check_inbound_messages(@outbound_message)
......
在show.html.erb
中<% unless @order_error.blank? %>
<%= @order_error.html_safe %>
<% else %>
<%= render "trace/display_tabular_data", :data => @order %>
<% end %>
.....
.....
<% unless @order_items_error.blank? %>
<%= @order_items_error.html_safe %>
<% else %>
<% @order_items.each do |order_item| %>
<h5>Order Item</h5>
<%= render "trace/display_tabular_data", :data => order_item %>
<% end %>
<% end %>
......
我的大多数功能都依赖于以前功能的结果。现在使用依赖于订单的get_order_items函数。如果订单不存在,则无需计算get_order函数,因为它也不存在。此外,它会激发一个错误,因为当我对get_order_item内的订单执行操作时,我说它传递了一个NIL对象。
此外,在show.html.erb - @order_items中,如果订单不存在,则甚至不应存在@order_items_error。我只想渲染函数直到order_error,然后停止。
现在,来自PHP背景,我忘记了rails没有死。那么还有替代的死亡吗?中止不是它。我需要它可耻地退出。或者是我最好的使用条件,如果,除非等...但它会看起来很丑,因为页面将充满他们。你怎么样呢?
答案 0 :(得分:1)
要切断当前操作并渲染视图,您可以使用return
。如果您尝试在视图中使用单元化实例变量,则会因错误而崩溃。
您还可以使用render nothing: true
来停止当前操作并且不进行任何操作。
也许考虑重新定向:
flash[:error] = 'There was no order!'
redirect_to :back
答案 1 :(得分:0)
我不确定你到底想做什么。但这应该满足你的要求。
def show
rule=Rule.new
@order,@order_error=rule.get_order(@order_external_id)
unless @order.blank?
@order_items, @order_items_error=rule.get_order_items(@order)
@order_item_units, @order_item_units_error=rule.get_order_item_units(@order_items) unless @order_items.blank?
end
@outbound_messages, @outbound_messages_error = rule.check_outbound_messages(@order_external_id)
@inbound_messages, @inbound_messages_error = rule.check_inbound_messages(@outbound_message) unless @outbound_messages.blank?
end
同样,您可以在视图文件中添加条件:
<% unless @order.blank? %>
<% unless @order_error.blank? %>
<%= @order_error.html_safe %>
<% else %>
<%= render "trace/display_tabular_data", :data => @order %>
<% end %>
.....
.....
<% unless @order_items.blank? %>
<% unless @order_items_error.blank? %>
<%= @order_items_error.html_safe %>
<% else %>
<% @order_items.each do |order_item| %>
<h5>Order Item</h5>
<%= render "trace/display_tabular_data", :data => order_item %>
<% end %>
<% end %>
<% end %>
.......
.......
<% end %>
我从你的例子中得到的只是一个基本的想法,虽然它不足以显示你想要实现的目标。所以,整个想法是在使用之前检查变量!
我想提一点,避免使用unless - else
,unless
应该单独使用,如果你需要在else
块中加入一些逻辑,为什么不使用{{ 1}}。这可能比if - else
更有意义。