我正在学习Michael Hartl的Rails教程(http://ruby.railstutorial.org/chapters/user-microposts#code-home_with_feed),我在第10.36章中,我们正在创建要在用户主页上显示的微柱提要。当我到达第10.41节时,我应该可以在主页上看到所有的帖子,但我一直得到
NoMethodError in StaticPagesController#home
private method `feed' called for #<User:0x007f881cf77410>
if signed_in?
@micropost = current_user.microposts.build if signed_in?
@feed_items = current_user.feed.paginate(page: params[:page]) <-- error line
end
end
我如何让User.feed方法不是私有的,这样我就可以在主页中使用?
user.rb 的代码
class User < ActiveRecord::Base
has_many :microposts, dependent: :destroy
before_save { self.email = email.downcase }
before_create :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /A[w+-.]+@[a-zd-]+(?:.[a-zd-]+)*.[a-z]+z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }
end
def feed
# This is preliminary. See "Following users" for the full implementation.
Micropost.where("user_id = ?", id)
end
def User.new_remember_token
SecureRandom.urlsafe_base64
end
def User.digest(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_remember_token
self.remember_token = User.digest(User.new_remember_token)
end
静态页面控制器的代码
class StaticPagesController < ApplicationController
def home
if signed_in?
@micropost = current_user.microposts.build if signed_in?
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
def help
end
def about
end
def contact
end
end
主页视图的代码
<% if signed_in? %>
<div class="row">
<aside class="span4">
<section>
<%= render 'shared/user_info' %>
</section>
<section>
<%= render 'shared/micropost_form' %>
</section>
</aside>
<div class="span8">
<h3>Post Feed</h3>
<%= render 'shared/feed' %>
</div>
</div>
"共享/馈送"文件
<% if @feed_item.any %>
<ol class="microposts">
<%= render partial: 'shared/feed_item', collection: @feed_items %>
</ol>
<%= will_paginate @feed_items %>
<% end %>
根据错误private method
馈送'called for#`,
您正在User
模型的实例上调用名为feed
的private
方法。
为了使以下代码工作
@feed_items = current_user.feed.paginate(page: params[:page])
确保User
模型中的方法feed
不在private
部分下
请记住,私有方法(即在任何类之外声明的方法)不能在其他对象上调用。
更新
您在定义方法之前关闭了User
类。因此,出现了错误。
class User < ActiveRecord::Base
## ...
validates :password, length: { minimum: 6 }
end ## REMOVE THIS end
def feed
## ...
private
def create_remember_token
self.remember_token = User.digest(User.new_remember_token)
end
end ## ADD THIS end