【问题标题】:NoMethodError in Users#show undefined method `following' for #<User:0xab068f0>用户中的 NoMethodError#show undefined method `following' for #<User:0xab068f0>
【发布时间】:2012-01-25 06:34:55
【问题描述】:

第 8 行出现以下错误。从 railstutorial.org 的 ch.11/12 学习。我使用的是 rails 3.1.3 和 ruby​​ 1.9.3 而不是教程中的建议。我环顾四周寻找有同样错误的其他人,但找不到这个问题的另一个例子。仍然是 Rails 的新手,这是我的第一篇文章。请帮忙!教我我错过了什么。谢谢!

用户中的 NoMethodError#show

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>

models/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

db/migrate/..._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

【问题讨论】:

  • 问号通常用于表示返回布尔值的方法。我会删除您尝试调用的方法中的问号。
  • 您能否添加来自user.rb 的有关关系的代码?太棒了!
  • 在原帖底部添加了 user.rb 文件。
  • 如果我删除了我得到的问号:错误的参数数量(0 代表 1)

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


【解决方案1】:

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

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

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

更多详情请参阅在线图书的section 12.11

添加该行后,现在@user 将有#following 方法可以调用,你可以说@user.following.count,它不会抛出错误。

【讨论】:

  • 为了清晰起见更正了 rails/ruby 版本。
  • 我查看了 12.11,发现我错过了您提到的内容和其他部分。感谢您的反馈和帮助!解决了。​​
【解决方案2】:

改变一下

<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]

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2015-03-19
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多