0

Rails パーシャルを理解するのに役立つ短い質問があります。RoR は初めてで、Rails を使用したアジャイル Web 開発に取り組んでいます。あなたが同じ本を持っているなら、私はイテレーション F1 にいます。

パーシャルを使用していない場合、カートの show.html.erb は次のようになります。

<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>

<!-- START_HIGHLIGHT -->
<h2>Your Cart</h2>
<table>
<!-- END_HIGHLIGHT -->
  <% @cart.line_items.each do |item| %>
<!-- START_HIGHLIGHT -->
    <tr>
      <td><%= item.quantity %>&times;</td>
      <td><%= item.product.title %></td>
      <td class="item_price"><%= number_to_currency(item.total_price) %></td>
    </tr>
<!-- END_HIGHLIGHT -->
  <% end %>
<!-- START_HIGHLIGHT -->
  <tr class="total_line">
    <td colspan="2">Total</td>
    <td class="total_cell"><%= number_to_currency(@cart.total_price) %></td>
  </tr>
<!-- END_HIGHLIGHT -->
<!-- START_HIGHLIGHT -->
</table>
<!-- END_HIGHLIGHT -->

<%= button_to 'Empty cart', @cart, method: :delete,
    data: { confirm: 'Are you sure?' } %>

次に、パーシャルの使用を開始するときに、_cart.html.erb というクラスを作成し、これを入れました。

<h2>Your Cart</h2>
<table>
  <%= render(cart.line_items) %>

  <tr class="total_line">
    <td colspan="2">Total</td>
    <td class="total_cell"><%= number_to_currency(cart.total_price) %></td>
  </tr>

</table>

<%= button_to 'Empty cart', cart, method: :delete, data: { confirm: 'Are you sure?' } %>

そして、私の show.html.erb をこれに変更しました:

<% if notice %>
    <p id="notice"><%= notice %></p>
<% end %>

  <%= render(@cart) %>

だから、私の混乱は、パーシャルがないのになぜ @cart.something を使わなければならないのかということです。私の理解では、それは私が使用していたモデルで、carts.rb と呼ばれていました。それで、パーシャルを作成するとき、@cart の代わりに単にカートを使用するだけで、パーシャルはまだモデルを使用していますか?

しかし、なぜ render(@cart) を使用するのでしょうか? このコマンドは、部分的な_cart.html.erbを使用しているだけですか? それを完全に理解するのを手伝ってくれる人はいますか?おそらくそのとおりですが、現時点では少し混乱しています:)

4

1 に答える 1

2

と言うときrender(@cart)、舞台裏で実際に起こっているのは、Rails が一般的にどのように動作するかの慣例に基づいて、Rails が多くの仮定を行っているということです。

@cart変数から始めましょう。これはインスタンス変数であり、コントローラー内のあらゆるものにアクセスできる変数です。ビューはコントローラーと特別な関係にあるため、コントローラー メソッド内で定義されたインスタンス変数はビュー内で使用できます。

パーシャル内で使用でき、この場合はすべて正常に機能します。@cartしかし、それは一般的に悪い考えです。パーシャルを別の場所で再利用できるようにしたい場合、インスタンス変数が存在すると仮定すると、コントローラーとパーシャルの間の結合が発生します。

Rails が提供するソリューションは、ローカル変数をパーシャルに渡す機能です。render(@cart)それが近道だと言ったのを覚えていますか?舞台裏で実際に起こっていることは次のとおりです。

render partial: 'carts/cart', locals: { cart: @cart }

Rails の規則に従っているため、Rails は次のような想定を行うことができます。

  • a のパーシャルCartは次の場所にあります。app/views/carts/_cart.html.erb
  • cartそのパーシャルは、メソッドに渡されるという名前のローカル変数を使用します。

その結果、次のようになります。

render @cart

上記のより冗長な行と同じ効果があります。

于 2013-08-22T10:54:59.533 に答える