1

私は Deface の DSL を使用して、いくつかのコンテンツを追加しようとしています。

app/overrides/spree/home/index/add_home_index_steps.html.erb.deface に次の内容のファイルがあります。

<!-- insert_before 'erb:contains("content_for :sidebar do")' -->
<h1>Hola</h1>

しかし、結果は次のとおりです。

<div id=wrapper" class="row" data-hook>
  <aside id="sidebar" class="columns four" data-hook>
    <div data-hook="homepage_sidebar_navigation">...</div>
  </aside>
  <div id="content" class="columns twelve" data-hook>
    <h1>Hola</h1>
    <div data-hook="homepage_products">...</div>
  </div>
</div>

私が期待していたもの:

<div id=wrapper" class="row" data-hook>
  <h1>Hola</h1>
  <aside id="sidebar" class="columns four" data-hook>
    <div data-hook="homepage_sidebar_navigation">...</div>
  </aside>
  <div id="content" class="columns twelve" data-hook>
    <div data-hook="homepage_products">...</div>
  </div>
</div>

insert_before の代わりに insert_after を使用すると、結果は次のようになります。

<div id=wrapper" class="row" data-hook>
  <aside id="sidebar" class="columns four" data-hook>
    <h1>Hola</h1>
    <div data-hook="homepage_sidebar_navigation">...</div>
  </aside>
  <div id="content" class="columns twelve" data-hook>
    <div data-hook="homepage_products">...</div>
  </div>
</div>

私はとても混乱しています。誰かこれを説明してください。何が間違っているのですか。

4

1 に答える 1

2

これは混乱しやすいので、何が起こっているのか見てみましょう。サイドバーのコードは次のとおりです。

https://github.com/spree/spree/blob/2d31d8a69d66e2555e00f67e3227a54a531aa6b8/frontend/app/views/spree/shared/_sidebar.html.erb

<aside id="sidebar" class="columns four" data-hook>
  <%= yield :sidebar %>
</aside>

https://github.com/spree/spree/blob/v2.1.2/frontend/app/views/spree/home/index.html.erb

<% content_for :sidebar do %>
  <div data-hook="homepage_sidebar_navigation">
    <%= render :partial => 'spree/shared/taxonomies' %>
  </div>
<% end %>

<div data-hook="homepage_products">
  <%= render :partial => 'spree/shared/products', :locals => { :products => @products } %>
</div>

これが評価されると、その content_for :sidebarのものは置き換えられますyield :sidebar

あなたの問題は、insert_before を実行しているときです。あなたはこれを得る:

<h1>Hola</h1>
<% content_for :sidebar do %>
  <!-- stuff that goes in to the sidebar -->
<% end %>

<div data-hook="homepage_products">...</div>

content_for はこのファイルの任意の場所で発生する可能性がありますが、yield に含まれるものを示しているだけなので、実際には問題ではありません。したがって、出力では、出力で得られるように、homepage_products div の前に表示されます。

Insert_after は次のことを行います。

<% content_for :sidebar do %>
  <h1>Hola</h1>
  <!-- stuff that goes in to the sidebar -->
<% end %>

<div data-hook="homepage_products">...</div>

したがって、生成されているセクション内に表示されることを期待しています。このようなもの:

<aside id="sidebar" class="columns four" data-hook>
  <h1>Hola</h1>
  <!-- stuff that goes in to the sidebar -->
</aside>

これもあなたが見るものです。

あなたの例のように、サイドバーの前に何かを表示したい場合は、別のオーバーライドを行う必要があります。オーバーライドspree/shared/_sidebarして insert_before を使用する必要があります#sidebar

問題が解決することを願っています。

于 2013-11-19T18:47:18.880 に答える