2014-10-30 4 views
0

Я следую этому руководству https://www.railstutorial.org/book/following_users#top и на шаге 12.14. Я следил за каждым шагом, кроме тех, которые добавляют тестовые данные, потому что я использую этот учебник, чтобы помочь мне научиться разрабатывать следующую функцию в моем собственном проекте.Ruby on Rails rake db: seed undefined in rails tutorial

Вот сообщение об ошибке с моей консоли:

rake aborted! 
NoMethodError: undefined method `each' for nil:NilClass 
/Users/alexanderkehaya/Desktop/wewrite/db/seeds.rb:13:in 

Любые идеи, что я делаю неправильно/не хватает? Редактирование: Как получить данные о семенах для грабли успешно?

Спасибо за помощь.

Вот мои данные:

ActiveRecord::Schema.define(version: 20141030023857) do 

create_table "collaborators_stories", id: false, force: true do |t| 
t.datetime "created_at" 
t.datetime "updated_at" 
t.integer "collaborator_id" 
t.integer "story_id" 
end 

create_table "lines", force: true do |t| 
t.string "text" 
t.integer "score",   default: 0 
t.integer "depth",   default: 0 
t.integer "previous_line_id" 
t.datetime "created_at" 
t.datetime "updated_at" 
t.integer "user_id" 
t.integer "story_id" 
end 

create_table "relationships", force: true do |t| 
t.integer "follower_id" 
t.integer "followed_id" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
end 

add_index "relationships", ["followed_id"], name: "index_relationships_on_followed_id" 
add_index "relationships", ["follower_id", "followed_id"], name:  "index_relationships_on_follower_id_and_followed_id", unique: true 
add_index "relationships", ["follower_id"], name: "index_relationships_on_follower_id" 

create_table "stories", force: true do |t| 
t.datetime "created_at" 
t.datetime "updated_at" 
end 

create_table "users", force: true do |t| 
t.string "email",     default: "", null: false 
t.string "encrypted_password",  default: "", null: false 
t.string "reset_password_token" 
t.datetime "reset_password_sent_at" 
t.datetime "remember_created_at" 
t.integer "sign_in_count",   default: 0, null: false 
t.datetime "current_sign_in_at" 
t.datetime "last_sign_in_at" 
t.string "current_sign_in_ip" 
t.string "last_sign_in_ip" 
t.datetime "created_at" 
t.datetime "updated_at" 
t.string "provider" 
t.string "uid" 
t.string "name" 
t.string "profile_image_url" 
end 

add_index "users", ["email"], name: "index_users_on_email", unique: true 
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

end 

Вот мой user.rb файл:

class User < ActiveRecord::Base 
# Include default devise modules. Others available are: 
# :confirmable, :lockable, :timeoutable and :omniauthable 
devise :database_authenticatable, :omniauthable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

has_many :lines 
has_many :active_relationships, class_name: "Relationship", 
           foreign_key: "follower_id", 
           dependent: :destroy 
has_many :passive_relationships, class_name: "Relationship", 
           foreign_key: "followed_id", 
           dependent: :destroy 
has_many :following, through: :active_relationships, source: :followed 
has_many :followers, through: :passive_relationships, source: :follower 
has_and_belongs_to_many :stories, :foreign_key => :collaborator_id, :join_table => :collaborators_stories 

def profile_image_uri(size = "mini") 
    # parse_encoded_uri(insecure_uri(profile_image_uri_https(size))) unless @attrs[:profile_image_url_https].nil? 
    unless self.provider == "facebook" 
     self.profile_image_url.sub! "normal", size unless self.profile_image_url.nil? 
    else 
     self.profile_image_url 
    end 
end 

#Follows a user. 
def follow(other_user) 
    active_relationships.create(followed_id: other_user.id) 
end 

# Unfollows a user. 
def unfollow(other_user) 
    active_relationships.find_by(followed_id: other_user.id).destroy 
end 

# Returns true if the current user is following the other user. 
def following?(other_user) 
    following.include?(other_user) 
end 
def self.find_for_twitter_oauth(auth, signed_in_resource=nil) 


    user = User.where(:provider => auth.provider, :uid => auth.uid).first 

    if user 

     if user.profile_image_url != auth.extra.raw_info.profile_image_url 
     user.update_attribute(:profile_image_url, auth.extra.raw_info.profile_image_url) 
     end 

     return user 

    else 
     registered_user = User.where(:email => auth.uid + "@twitter.com").first 

     if registered_user 

     return registered_user 
     else 

     user = User.create(name:auth.extra.raw_info.name, 
          provider:auth.provider, 
          profile_image_url:auth.extra.raw_info.profile_image_url, 
          uid:auth.uid, 
          email:auth.uid+"@twitter.com", 
          password:Devise.friendly_token[0,20], 
         ) 
     end 
    end 
    end 

    def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 

    user = User.where(:provider => auth.provider, :uid => auth.uid).first 
    if user 

     if user.profile_image_url != auth.info.image 
     user.update_attribute(:profile_image_url, auth.info.image) 
     end 

     return user 
    else 
     registered_user = User.where(:email => auth.info.email).first 
     if registered_user 
     return registered_user 
     else 
     user = User.create(name:auth.extra.raw_info.name, 
          provider:auth.provider, 
          profile_image_url:auth.info.image, 
          uid:auth.uid, 
          email:auth.info.email, 
          password:Devise.friendly_token[0,20], 
         ) 
    end 
end 
end 
end 

Вот мой relationships.rb файл:

class Relationship < ActiveRecord::Base 
belongs_to :follower, class_name: "User" 
belongs_to :followed, class_name: "User" 
validates :follower_id, presence: true 
validates :followed_id, presence: true 
end 

EDIT: Я добавил мой файл семян:

users = User.all 
user = users.first 
following = users[2..50] 
followers = users[3..40] 
following.each { |followed| user.follow(followed) } 
followers.each { |follower| follower.follow(user) } 
+1

Каков ваш вопрос – anusha

+0

Просто добавлено редактирование вверху. Вопрос: как мне избавиться от ошибки? Я новичок в рельсах/кодировании в целом. Не знаете, где искать проблему. @anusha – user3787971

+0

ошибка заключается в том, что у вас нет записей в 'follow' после удаления этого файла из семенного файла и попытайтесь проверить, получают ли таблица' user' в нем записи или нет – anusha

ответ

1

Сообщение об ошибке объясняет сам. undefined method 'each' for nil:NilClass сообщает, что вы пытаетесь отправить метод each в объект nil. Можно вывести, что following и/или followers, на которые вы звоните each, являются nil, а не ActiveRecord Relation объект, которым вы надеетесь.

Вы не забыли создать объекты User в своем файле семени? Если ваш файл семени точно так же, как показано в вашем вопросе, он не сработает, потому что у модели User нет объектов.

Необходимо сначала создать их, как показано на картинке here, перечисление 12.14. Вы можете использовать FactoryGirl, например, Railstutorial, или просто Ruby.

+0

@ user3787971 Если вы хотите использовать FactoryGirl, добавьте его в свое приложение. Суть в том, что вы должны сгенерировать и сохранить некоторые записи Пользователю до того, как этот код сможет работать. –

+0

Спасибо @MikeC, что было правильным направлением. Я понял это и многому научился. – user3787971