2013-04-17 37 views
4

我想用僞造數據填充數據庫,使用faker和populator gems。 使用Devise生成模型用戶。如何填充設計用戶

這是我耙文件

namespace :db do 
    desc "Fill database with sample data" 
    task populate: :environment do 
    [User, Article].each(&:delete_all) 
    password = "password" 

    User.populate 20 do |user| 
     user.name = Faker::Name.name 
     user.email = Faker::Internet.email 
     user.password = password 
     user.password_confirmation = password 
     Article.populate 5 do |article| 
     article.user_id = user.id 
     article.title = Populator.words(1..3).titleize 
     article.content = Populator.sentences(2..10) 
     article.created_at = 2.years.ago..Time.now 
     end 
    end 

    end 
end 

當我運行耙分貝:填入引發了以下

rake aborted! 
undefined method `password=' for #<Populator::Record:0xa179d14> 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/record.rb:64:in `method_missing' 
    /home/sunloverz/RubymineProjects/socialnews/lib/tasks/sample_date.rake:10:in `block (3 levels) in <top (required)>' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:53:in `call' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:53:in `block in build_records' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:50:in `times' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:50:in `build_records' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:43:in `block in populate' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:29:in `remember_depth' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:42:in `populate' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/model_additions.rb:25:in `populate' 
    /home/sunloverz/RubymineProjects/socialnews/lib/tasks/sample_date.rake:6:in `block (2 levels) in <top (required)>' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:246:in `call' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:241:in `each' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:241:in `execute' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:184:in `block in invoke_with_call_chain' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:177:in `invoke_with_call_chain' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/task.rb:170:in `invoke' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:143:in `invoke_task' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:101:in `block (2 levels) in top_level' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:101:in `each' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:101:in `block in top_level' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:110:in `run_with_threads' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:95:in `top_level' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:73:in `block in run' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling' 
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/rake-10.0.4/lib/rake/application.rb:70:in `run' 
    Tasks: TOP => db:populate 
    (See full trace by running task with --trace) 

有什麼不對?

+0

嘗試刪除'password ='password''並僅使用'user.password ='password''' user.password_confirmation =「密碼」'。 –

+0

我有同樣的問題,但'user.password = password'在控制檯中工作! – Brary

回答

6

填充器不會加載ActiveRecord的實例;所以任何驗證,回調,嵌入的方法都不起作用。相反,它會加載自己的Record對象,使用列屬性和純SQL來提高性能。另一方面,Devise不創建:密碼列,它創建encrypted_pa​​ssword列並執行場景後面的所有邏輯,如果您想了解有關代碼的詳細信息,請檢查此link

解決方法:我們需要調用password_digest來加密給定的密碼,然後直接設置encrypted_pa​​ssword,但是這個method受保護,不能在rake內部調用。相反,我們將使用'new'方法來觸發password_digest,因此您的代碼將如下所示:

password = "password" 

User.populate 20 do |user| 
    user.name = Faker::Name.name 
    user.email = Faker::Internet.email 
    user.encrypted_password = User.new(:password => password).encrypted_password 
    # rest of your code here  
end 
+0

感謝您的提示!我使用'password_digest'來使用我自己的基於會話/ cookie的認證,所以對於任何人來說,首先設置'password ='password''像上面那樣,然後設置它,使用'user.password_digest = User.new(:password =>密碼).password_digest' – Sia

0

確保您的型號(您的案例中的表格)actually有一個名爲"password"的列。

如果是這樣,那麼,嘗試檢查是否有attr_accessible :password

+0

它有一個列密碼和attr_accessible:密碼在用戶模型 –