我目前正在阅读 Michael Hartl 的教程 Ruby on Rails 教程http://ruby.railstutorial.org/ruby-on-rails-tutorial-book。我对某些部分变量的来源感到困惑。在他的教程中,他创建了用户和微博。用户可以在他的主页上创建一个 Micropost(称为 Feed)并将它们发布到那里。布局看起来像这样http://ruby.railstutorial.org/chapters/user-microposts#fig:proto_feed_mockup。现在 User 模型看起来像这样(我没有发布整个内容):
class User < ActiveRecord::Base
has_many :microposts, dependent: :destroy
def feed
Micropost.where("user_id = ?", id)
end
end
Micropost 模型如下所示:
class Micropost < ActiveRecord::Base
belongs_to :user
end
在文中作者说 User 模型中的 feed 方法可以等效地写成这样:
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 来自哪里,它包含什么?
谢谢,迈克