2013-02-22 127 views
1

在Rails待办事宜应用程序(来自Railscast的代码)的索引文件中,它列出了分配给任务控制器中实例变量的不完整和完整的任务。注意它调用render @incomplete_tasks和渲染@complete_tasks,而部分只调用使用一个部分渲染两个实例变量

_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 %> 
+0

你失去了我的“是Rails的可以忽略的实例变量的上半年”。你能解释一下吗? – jvnill 2013-02-22 07:38:19

回答

2

所以轨道着眼于模型对象,以确定使用哪个部分那种语法。在这两种情况下,实例变量都包含任务,因此rails知道使用_task部分。

+0

因此,只要以模型的名称结尾,实例变量的名称并不重要,在这种情况下_tasks? – Leahcim 2013-02-22 08:47:45

+0

或变量的名称在渲染时根本不重要 – Leahcim 2013-02-22 08:49:09

+1

是的,除非您传递选项哈希来声明要使用哪个部分。这是默认行为。 – wjandali 2013-02-22 16:44:55

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