2016-09-22 2 views
0

Можно ли иметь инструкцию else, если try()?Rails: есть ли инструкция else, если 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) терпит неудачу.

UPDATE:

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

Я использую этот фрагмент кода в заголовке и когда я открываю статическую страницу, на которой нет current_order не доступна, то я получаю:

NameError in Spree::Pages#show 

undefined local variable or method `current_order' for #<#<Class:0x007fcd7636c090>:0x007fcd8770e0c0> 

Есть ли легко исправить без использования пытаться?

+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_order Если это nil то &nbsp; будет показано.

Для записи, try используется, чтобы избежать методы, требующие от nil (так, например, foo.try(:bar) будет возвращать nil, если это foonil, тогда как foo.bar поднимет NoMethodError). Это не относится к вашему варианту использования здесь, поэтому вам не нужно try.

+0

Я использую этот фрагмент в заголовке своего сайта. когда фрагмент используется на статической странице, где нет текущего_порядка, я получаю с вашей попыткой сообщение об ошибке: «неопределенная локальная переменная или метод' current_order » – StandardNerd

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

Это привело бы к «неопределенной локальной переменной или методу« current_order »в первой строке. Попробуйте запустить 'foo.present? 'С консоли. 'present? 'используется для проверки, является ли ключ в хеше или если переменная равна нулю. Не проверять, определена ли переменная. – max

1

КИ, вероятно, есть более элегантное решение, но это работает:

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

вместо if current_order

1

.try утилит ActiveSupport для защиты от нулевых ошибок при вызове методы на переменном, которая может быть ноль. Он работает здесь, поскольку неявный субъект - это контекст представления, но не очень идиоматический.

Вместо этого вы должны использовать 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 запрос, если уже были загружены записи.

+0

потрясающе, спасибо большое! – StandardNerd

+0

результат <%, если local_assigns [: current_order]%> не равен <%, если определено? (Current_order) &&! Current_order.blank? %> – StandardNerd

+0

Нет - 'если local_assigns [: current_order]' будет просто проверять, является ли локальное назначение нулем. ['.blank?'] (http://guides.rubyonrails.org/active_support_core_extensions.html#blank-questionmark-and-present-questionmark) делает немного больше. – max