0

如果发生某些事件,我有一个需要退出的代码(死的 php 版本)

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没有死。那么有没有死亡的替代品?中止是不是。我需要它不光彩地退出。或者是我最好的使用条件的镜头,如果,除非等......但它会看起来很难看,因为页面将变得充满它们。你会怎么做?

4

2 回答 2

1

要切断当前动作并渲染视图,您可以使用return. 但是,如果您尝试在视图中使用未初始化的实例变量,这将因错误而崩溃。

您还可以使用render nothing: truewhich 停止当前操作并且不呈现任何内容。

也许也考虑重定向回来:

flash[:error] = 'There was no order!'
redirect_to :back
于 2013-03-01T19:30:02.313 回答
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块中,为什么不使用if - else。这可能比unless - else.

于 2013-03-04T07:53:25.270 回答