0

アプリで 3 つの異なる方法でレンダリングしたいカートがあります。

  1. サイドバーで。カート内の商品数とその合計金額のみを表示します。
  2. カートのメイン ビュー。各項目の商品、数量、合計金額へのリンクを含む項目を表示します。また、アイテムの数量を増減するボタンと、カートからアイテムを削除するボタンも表示されます。
  3. 注文ビューでは、商品へのリンク、数量を変更するボタン、および「削除」ボタンを除いて、メインのカート ビューと同じ方法でカートの内容を表示します。

これまでのところ、カートを次のようにレンダリングします。

carts/_cart.html.erb

<%= yield %>

カートサイドバーのレイアウトcarts/_sidebar.html.erb

<ul>
  <li class="nav-header">Your Cart (<%= pluralize(@cart.total_items, "Item") %>)</li>
  <li>Total Due: <%= number_to_euro(@cart.total_price) %></li>
  <% unless @cart.line_items.empty? %>
  <li><%= link_to "View Cart & Checkout", cart_path(@cart) %></li>
  <li><%= link_to "Empty Cart", @cart, :method => :delete %></li>
  <% end %>
</ul>

layouts/_sidebar.html.erbによってレンダリングされるもの<%= render :partial => 'carts/cart', :layout => 'carts/sidebar' %>

カートのメイン レイアウトcarts/_main.html.erb

<table>
  <tr>
    <th>Product</th>
    <th>Quantity</th>
    <th>Price</th>
    <th>Subtotal</th>
    <th></th>
  </tr>
  <%= render @line_items %>
  <tr id="total_line">
    <td colspan="3">Total:</td>
    <td><%= number_to_euro(@cart.total_price) %></td>
    <td></td>
  </tr>
</table>

からレンダリングされますcarts/show.html.erb

<h1><%= pluralize(@cart.total_items, "Item") %> in Your Cart</h1>
<%= render :partial => 'cart/cart', :layout => 'carts/main' %>
<%= link_to "Empty Cart", @cart, :method => :delete %>
<%= link_to "Checkout", new_order_path %>

また、現在カートのメイン ビューと同じ方法でcarts/_order.html.erbレンダリングされているものもあります。orders/new.html.erb

私がやりたいのは、 と からラインアイテムをレンダリングするための 2 つの異なるレイアウトを作成することcarts/show.html.erbですorders/new.html.erb。そしてそうするために、私は持ってい<%= yield %>ますline_items/_line_item.html.erb

カートのメイン レイアウトの品目レイアウトline_items/_main.html.erb

<tr>
  <td><%= link_to "#{line_item.product.brand.name} #{line_item.product.title}", product_path(line_item.product) %></td>
  <td>
    <%= link_to "-", decrement_line_item_path(line_item), :method => :post %>
    <%= line_item.quantity %>
    <%= link_to "+", increment_line_item_path(line_item), :method => :post %>
  </td>
  <td><%= number_to_euro(line_item.product.price) %></td>
  <td><%= number_to_euro(line_item.total_price) %></td>
  <td><%= link_to "Remove"), line_item, :method => :delete %></td>
</tr>

新しい注文ビューの同様の広告申込情報レイアウトline_items/_order.html.erb

<tr>
  <td><%= "#{line_item.product.brand.name} #{line_item.product.title}" %></td>
  <td><%= line_item.quantity %></td>
  <td><%= number_to_euro(line_item.product.price) %></td>
  <td><%= number_to_euro(line_item.total_price) %></td>
</tr>

ここから問題が始まります。コレクションをレンダリングする方法がわかりません。carts/_main.html.erbこんな感じでラインアイテムをレンダリングしてみました

<%= render :partial => 'line_items/line_item', :layout => 'line_items/main', :collection => @line_items %>

そしてcarts/_order.html.erbこんなところから

<%= render :partial => 'line_items/line_item', :layout => 'line_items/order', :collection => @line_items %>

しかし、私は Carts#show で LocalJumpError を取得します

Showing app/views/line_items/_line_item.html.erb where line #1 raised:

no block given (yield)

その他の :collection 名は何も表示しません。私は何を間違っていますか?

4

1 に答える 1

1

わかりました、私が間違ったことを理解しています。まず第一に、エラー メッセージno block given (yield)は、生成するものが何もないことを意味します。次に、この場合、パーシャルをレンダリングするときに :layout を使用する必要はありません。

からカートをレンダリングするには、layouts/_sidebar.html.erb単に を呼び出します<%= render :partial => 'carts/sidebar' %>

私が知らなかったことが1つあります。コレクションでパーシャルをレンダリングする場合、:partial name の 2 番目の部分は、そのコレクション内のローカル変数名になります。

これは、メイン カート ビューの一部です ( carts/_cart.html.erb):

<table>
  <tr>
    <td>Product</th>
    <td>Price</th>
    <td>Quantity</th>
    <td>Subtotal</th>
    <td></th>
  </tr>
  <%= render :partial => 'line_items/cart_item', :collection => @line_items %>
  <tr>
    <td colspan="3">Total:</td>
    <td><%= number_to_euro(@cart.total_price) %></td>
    <td></td>
  </tr>
</table>

によってレンダリングできます<%= render @cart %>。名前の/cart_item部分に注目してください。:partialでコレクション アイテムを参照する方法は次のline_items/_cart_item.html.erbとおりです。

<tr>
  <td><%= link_to "#{cart_item.product.brand.name} #{cart_item.product.title}", product_path(cart_item.product) %></td>
  <td><%= number_to_euro(cart_item.product.price) %></td>
  <td>
    <%= link_to "-"), decrement_line_item_path(cart_item), :method => :post %>
    <%= cart_item.quantity %>
    <%= link_to "+"), increment_line_item_path(cart_item), :method => :post %>
  </td>
  <td><%= number_to_euro(cart_item.total_price) %></td>
  <td><%= link_to "Remove"), cart_item, :method => :delete %></td>
</tr>

注文コントローラーに表示されているカートと同じ方法です。carts/_order.html.erb:

...
<%= render :partial => 'line_items/order_item', :collection => @line_items %>
...

line_items/_order_item.html.erb:

<tr>
  <td><%= "#{order_item.product.brand.name} #{order_item.product.title}"%></td>
  <td><%= number_to_euro(order_item.product.price) %></td>
  <td>&times; <%= order_item.quantity %></td>
  <td><%= number_to_euro(order_item.total_price) %></td>
  <td></td>
</tr>

それがすべて理にかなっていることを願っています。

于 2012-05-25T08:58:33.907 に答える