Rails:if try(:current_order)中是否有else语句?

时间:2016-09-22 13:35:38

标签: ruby-on-rails ruby-on-rails-4

是否可以在try()中使用else语句?

else块将被忽略:

var options = {
legend: {
    show: true,     
    position: "ne",     
    //backgroundColor: "#fdff00",
    backgroundOpacity: "0",
    margin: [-50,0]
    //container: null or jQuery object/DOM element/jQuery expression
}, ecc
};

$(document).ready(function(){
    graph = $('.Graph').plot(formatFlotData(),options).data("plot");
});

如果try(:current_order)失败,我想实现 <% if try(:current_order) %> <% if current_order.state != 'complete' && current_order.line_items.count > 0 %> <%= current_order.line_items.count %> <% end %> <% else %> <%= "&nbsp;".html_safe %> <% end %> 的打印。

更新:

&nbsp;

我在标题中使用此代码段,当我打开一个没有current_order可用的静态页面时,我得到:

    <li class="icon icon-cart">
      <%= link_to spree.cart_path do %>
      <div class="cart">
        <%= image_tag("shopping_bag.png", class: 'shopping-bag') %>
        <span class="cart-items-count">
          <% if current_order %>
            <% if current_order.state != 'complete' && current_order.line_items.count > 0 %>
              <%= current_order.line_items.count %>
            <% end %>
          <% else %>
            &nbsp;
          <% end %>
        </span>
      </div>
      <% end %>
    </li>

有没有使用试用的简单修复?

4 个答案:

答案 0 :(得分:2)

为什么在这里使用try?只需使用current_order本身:

<% if current_order %>
  <% if current_order.state != 'complete' && current_order.line_items.count > 0 %>
    <%= current_order.line_items.count %>
  <% end %>
<% else %>
  &nbsp;
<% end %>

如果current_ordernil,则会显示&nbsp;

对于记录,try用于避免在nil上调用方法(因此,如果foo.try(:bar)nil,则foo将返回nil } {而foo.bar会引发NoMethodError)。这与您的用例无关,因此您不需要try

答案 1 :(得分:1)

好的,可能有一个更优雅的解决方案,但这有效:

<% if defined?(current_order) && !current_order.blank? %>

而不是if current_order

答案 2 :(得分:1)

.try一个ActiveSupport实用程序,用于在可能为nil的变量上调用方法时防止出现nil错误。它在这里工作,因为隐式主题是视图上下文,但不是非常惯用。

相反,您应该使用local_assigns[:current_order]来检查局部变量是否可用于视图,部分或布局。

让我们开始清理它。

current_order.state != 'complete'闻起来。确定订单是否完整不应由视图完成!

class Order < SomeOtherClass

  # ...
  def complete?
    state == 'complete'
  end
end

然后我们可以清理部分:

<% if local_assigns[:current_order] %>
  <% if !current_order.complete? &&  current_order.line_items.any? %>
    <%= current_order.line_items.size %>
  <% end %>
<% else %>
  <%# no order found %>
  <%= "&nbsp;".html_safe %>
<% end %>

如果已加载记录,则使用.size代替.count可以避免执行COUNT查询。

答案 3 :(得分:0)

else

没有try

您可以检查是否存在current_order

<% if current_order.present? && current_order.state != 'complete' && current_order.line_items.count > 0 %>
  <%= current_order.line_items.count %>
<% else %>
  &nbsp;
<% end %>