如果满足条件,优雅地退出导轨?

时间:2013-03-01 14:27:08

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个代码,我需要退出(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没有死。那么还有替代的死亡吗?中止不是它。我需要它可耻地退出。或者是我最好的使用条件,如果,除非等...但它会看起来很丑,因为页面将充满他们。你怎么样呢?

2 个答案:

答案 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 - elseunless应该单独使用,如果你需要在else块中加入一些逻辑,为什么不使用{{ 1}}。这可能比if - else更有意义。