使用一个局部渲染两个实例变量

时间:2013-02-22 07:35:26

标签: ruby-on-rails

在Rails待办事项应用程序的索引文件(来自Railscast的代码)中,它列出了分配给任务控制器中的实例变量的不完整和完整的任务。注意它如何调用渲染@incomplete_tasks并渲染@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 %>

3 个答案:

答案 0 :(得分:2)

因此rails会查看模型对象,以确定在使用这种语法时要使用哪个部分。在这两种情况下,实例变量都包含任务,因此rails知道使用_task partial。

答案 1 :(得分:0)

复制@ryanb的答案,请在此处查看:Rails: Rendering Models?

如果您将模型直接传递给render,它将尝试为其渲染部分模型。

<%= 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 %>

答案 2 :(得分:0)

这个问题有完整的答案。

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

2.2.13避免双重渲染错误