2012-07-11 112 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包含的单个文件。