2012-11-28 34 views
0

我正在folowwing嘰嘰喳喳克隆,flitter上的查爾斯馬克斯伍德教程。 當我啓動rake db:seed時,發生了錯誤undefined method friendships。嘗試通過rake db:seed任務添加好友,方法add_friend在User模型中定義。但我需要幫助來定義方法友誼,以便任務可以工作。非常感謝您的幫助。如何使我的方法add_friend工作在耙分貝:種子

這裏是DB/seeds.rb文件

require 'faker' 
require 'populator' 

User.destroy_all 

10.times do 
    user = User.new 
    user.username = Faker::Internet.user_name 
    user.email = Faker::Internet.email 
    user.password = "test" 
    user.password_confirmation = "test" 
    user.save 
end 


User.all.each do |user| 
    Flit.populate(5..10) do |flit| 
    flit.user_id = user.id 
    flit.message = Faker::Lorem.sentence 
    end 

    3.times do 
    User.add_friend(User.all[rand(User.count)]) 
    end 
end 

並且存在用戶文件。

class User < ActiveRecord::Base 
    # new columns need to be added here to be writable through mass assignment 
    attr_accessible :username, :email, :password, :password_confirmation 

    attr_accessor :password 
    before_save :prepare_password 

    validates_presence_of :username 
    validates_uniqueness_of :username, :email, :allow_blank => true 
    validates_format_of :username, :with => /^[-\w\[email protected]]+$/i, :allow_blank => true, :message => "should only contain letters, numbers, or [email protected]" 
    validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i 
    validates_presence_of :password, :on => :create 
    validates_confirmation_of :password 
    validates_length_of :password, :minimum => 4, :allow_blank => true 

    has_many :flits, :dependent => :destroy 

    has_many :friendships 
    has_many :friends, :through => :friendships 



    def self.add_friend(friend) 
    friendship = friendships.build(:friend_id => friend.id) 
     if !friendship.save 
     logger.debug "User '#{friend.email}' already exists in the user's friendship list." 
     end 
    end 

    # login can be either username or email address 
    def self.authenticate(login, pass) 
    user = find_by_username(login) || find_by_email(login) 
    return user if user && user.password_hash == user.encrypt_password(pass) 
    end 

    def encrypt_password(pass) 
    BCrypt::Engine.hash_secret(pass, password_salt) 
    end 

    private 

    def prepare_password 
    unless password.blank? 
     self.password_salt = BCrypt::Engine.generate_salt 
     self.password_hash = encrypt_password(password) 
    end 
    end 
end 

friendship.rb

class Friendship < ActiveRecord::Base 
    attr_accessible :friend_id, :user_id 

    belongs_to :user 
    belongs_to :friend, :class_name => 'User' 
    validates_uniqueness_of :friend_id, :scope => :user_id 
    validates_presence_of :user_id, :friend_id 
end 
+0

可以ü張貼滿錯誤跟蹤 – sameera207

回答

0

我想你想什麼做的是調用add_friend實例user和不上User

3.times do 
    user.add_friend(User.all[rand(User.count)]) 
end 

而且你add_friend方法應該是一個實例方法,而不是一個類的方法,所以你不需要self

def add_friend(friend) 
    friendship = friendships.build(:friend_id => friend.id) 
    if !friendship.save 
     logger.debug "User '#{friend.email}' already exists in the user's friendship list." 
    end 
end 
+0

你是對的,對不起,我已經做到了,只是犯了一個錯誤。我問這個問題,但我已經修改add_friend self.add_friend,但我得到的錯誤是未定義的方法友誼,w至於add_friend – skip87

+0

沒有你最初是正確的。它應該是'def add_friend'而不是'def self.add_friend'。請仔細閱讀我的答案。 –

+0

但是當我不把它定義爲一個類的方法我越來越對add_friend – skip87

0

你應該定義該方法的類方法不是實例方法:

def self.add_friend(friend) 
    friendship = friendships.build(:friend_id => friend.id) 
     if !friendship.save 
     logger.debug "User '#{friend.email}' already exists in the user's friendship list." 
     end 
    end 
+0

你是對的,對不起,我已經做了,只是犯了一個錯誤。我在問這個問題。 – skip87

+0

這沒有任何意義。 'add_friend'引用'友誼',它是在實例上定義的,而不是在類上定義的,所以它應該是一個實例方法而不是類方法。這部分原始代碼是正確的。 –

+0

好吧,我想現在右shioyama :) – zolter

相關問題