Используйте дефейс для изменения плохого кода в магазине Spree

Я работаю в Spree, и я пытаюсь использовать Deface, чтобы изменить это.

<% if order.has_step?("delivery") %>
  <div class="columns alpha four" data-hook="order-ship-address">
    <h6><%= Spree.t(:shipping_address) %> <%= link_to "(#{Spree.t(:edit)})", checkout_state_path(:address) unless @order.completed? %></h6>
    <%= render :partial => 'spree/shared/address', :locals => { :address => order.ship_address } %>
  </div>
<% end %>

<% if @order.has_step?("delivery") %>
  <div class="columns alpha four">
    <h6><%= Spree.t(:shipments) %> <%= link_to "(#{Spree.t(:edit)})", checkout_state_path(:delivery) unless @order.completed? %></h6>
    <div class="delivery">
      <% order.shipments.each do |shipment| %>
        <div>
          <i class='fa fa-truck'></i>
          <%= Spree.t(:shipment_details, :stock_location => shipment.stock_location.name, :shipping_method => shipment.selected_shipping_rate.name) %>
        </div>
      <% end %>
    </div>
    <%= render(:partial => 'spree/shared/shipment_tracking', :locals => {:order => @order}) if @order.shipped? %>
  </div>
<% end %>

..в это.

<div class="columns alpha four" data-hook="order-ship-address">
  <h6><%= Spree.t(:shipping_address) %> <%= link_to "(#{Spree.t(:edit)})", checkout_state_path(:address) unless @order.completed? %></h6>
  <%= render :partial => 'spree/shared/address', :locals => { :address => order.ship_address } %>
</div>

Я уже отправил запрос на вытягивание избыточного оператора if и добавил обработчик данных ко второму оператору if @order.has_step?("delivery"), но тем временем мне нужно написать переопределение дефейса, которое изменит страницу как мне нужно, чтобы это выглядело. Возможно, я смогу удалить первое выражение if @order.has_step?("delivery"), так как я думаю, что Deface нацелится на первый экземпляр того, о чем я говорю на странице, если я напишу

:remove => "erb[silent]:contains('if order.has_step?(\"delivery\"')")

хотя, честно говоря, документация не очень хороша в этом отношении. В любом случае, как я могу полностью удалить второй оператор if? Для этого нет хука данных, и использование

:remove_content => "erb[silent]:contains('if order.has_step?(\"delivery\"')")

просто удаляет содержимое первого оператора if. Я не могу настроить таргетинг на первый div во втором операторе if, так как в первом операторе if уже есть div class="columns alpha four". Я не хочу оставлять пустой div на странице, что мне делать?


person Gogglor    schedule 01.12.2014    source источник


Ответы (2)


Два оператора if в указанном коде не ссылаются на одну и ту же переменную. Первый if относится к order, а второй к @order.

При использовании deface для удаления существующих разделов erb строка, переданная в contains, должна точно соответствовать коду, который вы хотите переместить, чтобы переопределение правильно его нашло. Поскольку второй оператор if использует @order, а ваш сопоставитель не включает символ @, он не удалит этот конкретный оператор if.

Основываясь на тестах rspec в репозитории deface, не похоже, что в настоящее время вы можете использовать несколько совпадающих строк с одним переопределением в действии remove. Вместо этого вам придется использовать второе переопределение, чтобы обработать второй оператор if и удалить его.

person RickyTomatoes    schedule 01.12.2014
comment
ПОЛНОСТЬЮ пропустил разницу в заказе @order - спасибо, что указали на это! - person Gogglor; 02.12.2014

Запрос на вытягивание, который я разместил в Spree, сделал всю эту проблему спорной (с которой вы можете ознакомиться здесь, если вам интересно: https://github.com/spree/spree/pull/5692). Кроме того, оказывается, что функции @order и order в этом документе абсолютно одинаковы, и все ссылки на @order в любом случае удаляются из Spree.

person Gogglor    schedule 02.12.2014