2012-07-11 196 views
1

我目前正在通過Michael Hartl的教程Ruby on Rails教程http://ruby.railstutorial.org/ruby-on-rails-tutorial-book。我對某些部分變量來自哪裏感到困惑。在他的教程中,他創建了Users和Microposts。用戶可以在他的主頁上創建一個Micropost(稱爲Feed)並將它們發佈到那裏。佈局看起來像這樣http://ruby.railstutorial.org/chapters/user-microposts#fig:proto_feed_mockup。現在,用戶模型看起來像這樣(我不張貼整個事情):實例vs局部變量

class User < ActiveRecord::Base 
    has_many :microposts, dependent: :destroy 

    def feed 
    Micropost.where("user_id = ?", id) 
    end 
end 

的模型微柱看起來是這樣的:

class Micropost < ActiveRecord::Base 
    belongs_to :user 
end 

在文本的作者說,進料方法內用戶型號可以這樣等效寫入:

def feed 
    microposts 
end 

它們爲什麼一樣呢?

我的下一個問題是偏分量問題。在用戶的顯示頁面(show.html.erb)的_microposts.html.erb被調用這一點,如果我沒有記錯:

<%= render @microposts %> 

_microposts.html.erb看起來是這樣的:

<li> 
    <span class="content"><%= micropost.content %></span> 
    <span class="timestamp"> 
    Posted <%= time_ago_in_words(micropost.created_at) %> ago. 
    </span> 
    <% if current_user?(micropost.user) %> 
    <%= link_to "delete", micropost, method: :delete, 
     data: { confirm: "You sure?" }, 
     title: micropost.content %> 
    <% end %> 
</li> 

這裏我的問題是micropost變量來自哪裏?它是否與調用此部分的@micropost變量相同?

現在用戶主頁(home.html.erb)上存在的_feed.html.erb通話部分是這樣的:

<%= render 'shared/feed' %> 

_feed.html.erb看起來是這樣的:

<% if @feed_items.any? %> 
    <ol class="microposts"> 
    <%= render partial: 'shared/feed_item', collection: @feed_items %> 
    </ol> 
    <%= will_paginate @feed_items %> 
<% end %>  

我知道@feed_items來自哪裏。它設置在一個控制器中。現在_feed_item.html.erb看起來是這樣的:

<li id="<%= feed_item.id %>"> 
    <%= link_to gravatar_for(feed_item.user), feed_item.user %> 
    <span class="user"> 
    <%= link_to feed_item.user.name, feed_item.user %> 
    </span> 
    <span class="content"><%= feed_item.content %></span> 
    <span class="timestamp"> 
    Posted <%= time_ago_in_words(feed_item.created_at) %> ago. 
    </span> 
    <% if current_user?(feed_item.user) %> 
    <%= link_to "delete", feed_item, method: :delete, 
     data: { confirm: "You sure?" }, 
     title: feed_item.content %> 
    <% end %> 
</li> 

所以,類似的問題在哪裏變量feed_item來自何方,它包含哪些內容?

感謝, 麥克

回答

1

好的,讓我們來看看。這是一個很大的問題,但...

  1. 爲什麼'飼料'等於'microposts'? 這是Rails的工作協會。當您使用has_many來描述關聯時,Rails會根據關聯名稱創建一大堆方法。在這種情況下,你說用戶has_many :microposts,其中,創建一個User#microposts方法。

  2. 渲染調用中使用的實例變量(@microposts)大概是在控制器操作中設置的。當以這種方式調用渲染(使用一組ActiveRecord對象)時,Rails會查找名稱與這些對象的類名匹配的部分。在這種情況下,它們是MicroPost對象,因此它會查找部分名爲_micropost併爲陣列中的每個對象呈現一次。在渲染局部變量時,可以使用與局部變量名稱相同的局部變量來引用局部變量的對象。由於這是_micropost部分,因此本地micropost變量引用它正在呈現的對象。

  3. 再一次,與局部同名的局部變量引用局部正在渲染的對象。 @feed_items是一個集合,對於其中的每個對象,您將得到_feed_item部分的一個呈現,其中feed_item局部變量引用該對象。

0
  1. 由於用戶的微柱使用has_many關聯,並在內部的關係是基於用戶的ID。通過「手工」獲得它們本質上是一回事,但是工作量更多。
  2. micropost來自約定– Rails爲您創建它。我不知道「@micropost」變量是什麼意思,它調用了這個部分「。
  3. 同樣的答案,雖然它明確地基於模板名稱(IIRC)而不是單一化名稱。它包含任何@feed_items包含的單個文件。