Ruby on rails 如果条件满足,是否优雅地退出轨道?

Ruby on rails 如果条件满足,是否优雅地退出轨道?,ruby-on-rails,ruby,ruby-on-rails-3,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_er

我有一个代码,如果发生某些事件,我需要退出(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_项中的订单执行操作时,我正在向它传递一个NIL对象

此外,在show.html.erb中-@order\u items和@order\u items\u错误即使在订单不存在的情况下也不应该存在。我只想渲染函数直到出现顺序错误,然后停止


现在,来自PHP背景,我忘记了rails没有死。那么,是否有一种替代品?流产,不是吗。我需要它让我丢脸地离开。或者是我最好的使用条件句if,除非等…但它看起来很难看,因为页面将充满它们。您对此有何看法?

要切断当前操作并呈现视图,您可以使用
返回
。但是,如果尝试在视图中使用统一化的实例变量,则会出现错误

您还可以使用
render nothing:true
停止当前操作并不渲染任何内容

也可以考虑重定向:

flash[:error] = 'There was no order!'
redirect_to :back

我不知道你到底想做什么。但这应该符合你的要求

 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 %>

@订单%>
.....
.....
订单项目
订单\项目%>
.......
.......
这只是我从你的例子中得到的一个基本想法,尽管还不足以清楚地表明你想要实现什么。所以,整个想法是在使用变量之前检查它


我想再提一点,避免使用
除非-else
除非应该单独使用,如果需要在
else
块中放入一些逻辑,为什么不使用
如果-else
。这可能比
更有意义,除非-else

你不想呈现页面吗?你还没有很清楚你到底想发生什么。我很有信心,你不想因为丢失了一段数据就退出Rails服务器。@Thewalus先生-现在问题更清楚了吗?@MikeCampbell-更好了?嗯,我在想同样的事情……将把除非else改为if else代码块。