用户#中的NoMethodError显示未定义的方法`follow'for#<user:0xab068f0> </user:0xab068f0>

时间:2012-01-25 06:34:56

标签: ruby-on-rails-3 undefined relationships nomethoderror

我从第8行得到以下错误。从railstutorial.org的第11/12页开始学习。我使用rails 3.1.3和ruby 1.9.3而不是教程中的建议。我已经四处寻找其他具有相同错误的人,并且无法找到此问题的另一个示例。还是铁杆的新手,这是我的第一篇文章。请帮忙!教我错过了什么。谢谢!

用户#show中的NoMethodError

undefined method `following' for #<User:0xab068f0>

提取的来源(第8行):

5:       <td>
6:         <a href="<%= following_user_path(@user) %>">
7:           <span id="following" class="stat">
8:             <%= @user.following.count %> following
9:           </span>
10:         </a>
11:       </td>

模板包含跟踪:app / views / users / show.html.erb

app/views/shared/_stats.html.erb:8:in `_app_views_shared__stats_html_erb__794775909_89084750'
app/views/users/show.html.erb:32:in `_app_views_users_show_html_erb__961188432_91976190'

完整追踪:

activemodel (3.1.3) lib/active_model/attribute_methods.rb:385:in `method_missing'
activerecord (3.1.3) lib/active_record/attribute_methods.rb:60:in `method_missing'
app/views/shared/_stats.html.erb:8:in `_app_views_shared__stats_html_erb__794775909_89084750'

show.html.erb

31: <%= render 'shared/stats' %>
32: <%= render 'shared/user_info' %>

_stats.html.erb

<% @user ||= current_user %>
<div class="stats">
  <table summary="User stats">
    <tr>
      <td>
        <a href="<%= following_user_path(@user) %>">
          <span id="following" class="stat">
            <%= @user.following.count %> following
          </span>
        </a>
      </td>
      <td>
        <a href="<%= followers_user_path(@user) %>">
          <span id="followers" class="stat">
            <%= pluralize(@user.followers.count, "follower") %>
          </span>
        </a>
      </td>
    </tr>
  </table>
</div>

模型/ relationship.rb

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

   belongs_to :follower, :class_name => "User"
   belongs_to :followed, :class_name => "User"

   validates :follower_id, :presence => true
   validates :followed_id, :presence => true

end

分贝/迁移/..._ create_relationships.rb

class CreateRelationships < ActiveRecord::Migration
  def self.up
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end
    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], :unique => true
  end

  def self.down
    drop_table :relationships
  end
end

编辑:这是user.rb文件

require 'digest'
class User < ActiveRecord::Base

attr_accessor :password
attr_accessible :first_name, :last_name, :email, :password, 
                :salt, :password_confirmation, :zip_id, 
                :country, :birthdate, :gender, :photo



     #paperclip
  has_attached_file :photo, 
      :default_url => ":rails_root/public/images/default.png",
      :url => "/images/user_photos/:id/:style/:basename.:extension",
      :path => ":rails_root/public/images/user_photos/:id/:style/:basename.:extension",
      :styles => { 
        :thumb => "150x150",
        :small  => "250x250" }  

validates_attachment_size :photo, :less_than => 5.megabytes
validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/png']

    # associates microposts to users.  The second part will destroy all posts by this user if you destroy the user
    has_many :microposts, :dependent => :destroy

  def feed
    Micropost.from_users_followed_by(self)    
  end

  has_many :reverse_relationships, :foreign_key => "followed_id",
                                   :class_name => "Relationship",
                                   :dependent => :destroy
  has_many :followers, :through => :reverse_relationships, :source => :follower


  def following?(followed)
    relationships.find_by_followed_id(followed)
  end

  def follow!(followed)
    relationships.create!(:followed_id => followed.id)
  end

  def unfollow!(followed)
    relationships.find_by_followed_id(followed).destroy
  end




email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

validates :first_name,  :presence => true,
                        :length   => { :maximum => 30 }
validates :last_name,   :presence => true,
                        :length   => { :maximum => 30 }
validates :email,       :presence => true,
                        :format   => { :with => email_regex },
                        :uniqueness => { :case_sensitive => false },
                        :length   => { :maximum => 50 }
validates :zip_id,      :presence => true,
                        :length       => { :within => 5..5 }, :numericality => true

validates :password,    :presence => true,
                        :length       => { :within => 6..40 },
                        :confirmation => true                       
  before_save :encrypt_password

  def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
  end

  def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil  if user.nil?
    return user if user.has_password?(submitted_password)
  end

  private

    def encrypt_password
      self.salt = make_salt unless has_password?(password)
      self.encrypted_password = encrypt(password)
    end

    def encrypt(string)
      secure_hash("#{salt}--#{string}")
    end

    def make_salt
      secure_hash("#{Time.now.utc}--#{password}")
    end

    def secure_hash(string)
      Digest::SHA2.hexdigest(string)
    end

    def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil  if user.nil?
    return user if user.has_password?(submitted_password)
  end

  def self.authenticate_with_salt(id, cookie_salt)
    user = find_by_id(id)
    (user && user.salt == cookie_salt) ? user : nil
  end


end

以下是来自:controllers / users_controller.rb

的关注者/关注者
  def following
    @title = "Following"
    @user = User.find(params[:id])
    @users = @user.following.paginate(:page => params[:page])
    render 'show_follow'
  end

  def followers
    @title = "Followers"
    @user = User.find(params[:id])
    @users = @user.followers.paginate(:page => params[:page])
    render 'show_follow'
  end

2 个答案:

答案 0 :(得分:1)

首先,3.1.3是Rails版本,1.8.7似乎是Ruby版本而不是Rails。你应该纠正它。根据您在问题中发布的内容,following模型中没有user方法。只有following?(followed)方法和其他方法,但不是following方法。

我认为您在User类中缺少此部分:

class User < ActiveRecord::Base
  .
  has_many :following, :through => :relationships, :source => :followed
  .
end

有关详细信息,请参阅在线图书的section 12.11

添加该行后,由于现在@user#following方法调用,您可以说@user.following.count并且不会抛出错误。

答案 1 :(得分:0)

只需更改

<a href="<%= following_user_path(@user) %>"> 

<a href="<%= followings_user_path(@user) %>">.

它对我有用,因为我得到同样的错误。检查你的routes.rb它应该

root  to: 'static_pages#home'
  resources :users do
    member do
      get :followings, :followers
    end
  end
  resources :sessions, only: [:new, :create, :destroy]
  resources :microposts, only: [:create, :destroy]
  resources :relationships, only: [:create, :destroy]