1

Rails to-doアプリ(Railscastのコード)のインデックスファイルには、タスクコントローラーのインスタンス変数に割り当てられた不完全なタスクと完了したタスクが一覧表示されます。パーシャルが呼び出されるだけであるのに対し、render@incomplete_tasksとrender@complete_tasksがどのように呼び出されるかに注意してください。

_task.html.erb

この1つの部分は、不完全なタスクと完全なタスクの両方をレンダリングするために使用されているようです。Railsはインスタンス変数の前半(つまり、@ incompleteと@complete)を無視して、両方をレンダリングするために1つのパーシャルを使用できますか?

コントローラ

 def index
    if current_user
      @incomplete_tasks = current_user.tasks.where(complete: false)
      @complete_tasks = current_user.tasks.where(complete: true)
    end
  end

索引

<% if @incomplete_tasks.empty? && @complete_tasks.empty? %>
    <p>Currently no tasks. Add one above.</p>
  <% else %>
    <h2>Incomplete Tasks</h2>
    <div class="tasks" id="incomplete_tasks">
      <%= render @incomplete_tasks %>
    </div>

    <h2>Complete Tasks</h2>
    <div class="tasks" id="complete_tasks">
      <%= render @complete_tasks %>
    </div>
  <% end %>

_task.html.erb

<%= form_for task, remote: true do |f| %>
  <%= f.check_box :complete %>
  <%= f.label :complete, task.name %>
  <%= link_to "(remove)", task, method: :delete, data: {confirm: "Are you sure?"}, remote: true %>
<% end %>
4

3 に答える 3

2

したがって、Rails はモデル オブジェクトを調べて、そのような構文を使用する場合に使用するパーシャルを決定します。どちらの場合も、インスタンス変数にはタスクが含まれているため、Rails は _task パーシャルを使用することを認識しています。

于 2013-02-22T07:42:10.040 に答える
0

この質問には完全な答えがあります。

http://guides.rubyonrails.org/layouts_and_rendering.html

2.2.13 二重レンダリング エラーの回避

于 2013-02-22T10:26:51.460 に答える
0

@ryanb の回答をコピーして、こちらを参照してください: Rails: Rendering Models?

モデルをレンダリングに直接渡すと、そのモデルのパーシャルをレンダリングしようとします。

<%= render @thing %>

と同じです。

<%= render :partial => 'things/thing', :object => @thing %>

モデルの配列を渡すと...

<%= render @things %>

_thingこれを行ったかのように、それぞれのパーシャルをレンダリングします。

<%= render :partial => 'things/thing', :collection => @things %>

注: これには Rails 2.3 が必要です。以前のバージョンの Rails を使用している場合は、同じことを行うために :partial オプションを使用する必要があります。

<%= render :partial => @thing %>
于 2013-02-22T07:44:41.900 に答える