2013-02-22 39 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 %>