如何在用户模型中获取"feed"方法不是私有的,以便我可以在我的static_page/主页中显示提要(迈克尔·哈特尔 Rails 教程)



我正在学习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模型的实例上调用名为feedprivate方法。

为了使以下代码工作

 @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 

最新更新