我从第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
答案 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]