1

在 Rails 待办事项应用程序的索引文件(来自 Railscast 的代码)中,它列出了分配给任务控制器中实例变量的不完整和完整任务。注意它是如何调用render @incomplete_tasks 和render @complete_tasks,而partial 只被调用

_task.html.erb

似乎这一部分用于渲染不完整和完整的任务。Rails 是否能够忽略实例变量的前半部分(即@incomplete 和@complete)来使用一个部分来渲染两者?

控制器

 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

复制@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 回答
0

这个问题有完整的答案。

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

2.2.13 避免双重渲染错误

于 2013-02-22T10:26:51.460 回答