【问题标题】:bundle exec rake db:populate - activerecord::recordinvalid:validation failed:email has already been takenbundle exec rake db:populate - activerecord::recordinvalid:validation failed:email has been taken
【发布时间】:2014-07-03 08:47:09
【问题描述】:

我目前正在阅读 michael hartl 教程的第 10 章,当我尝试执行 bundle exec rake db:populate 时出现问题。

附上错误信息:

rake aborted!                                                                                                                        
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken                                                         
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/validations.rb:57:in `save!'                                  
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/attribute_methods/dirty.rb:29:in `save!'                      
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/transactions.rb:273:in `block in save!'                       
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/transactions.rb:329:in `block in with_transaction_returning_st
atus'                                                                                                                                
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:211:in `bl
ock in transaction'                                                                                                                  
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:219:in `wi
thin_new_transaction'                                                                                                                
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:211:in `tr
ansaction'                                                                                                                           
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/transactions.rb:208:in `transaction'                          
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/transactions.rb:326:in `with_transaction_returning_status'    
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/transactions.rb:273:in `save!'                                
/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/validations.rb:41:in `create!'                                
/home/action/workspace/app3/lib/tasks/sample_data.rake:4:in `block (2 levels) in <top (required)>'                                   
Tasks: TOP => db:populate                                                                                                            
(See full trace by running task with --trace)    

附上sample_data.rake文件:

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do
    admin = User.create!(name: "Example User",
                         email: "example@railstutorial.org",
                         password: "foobar",
                         password_confirmation: "foobar",
                         admin: true)
    User.create!(name: "Example User",
                 email: "example@railstutorial.org",
                 password: "foobar",
                 password_confirmation: "foobar")
    99.times do |n|
      name  = Faker::Name.name
      email = "example-#{n+1}@railstutorial.org"
      password  = "password"
      User.create!(name: name,
                   email: email,
                   password: password,
                   password_confirmation: password)
      users = User.all(limit: 6)
      50.times do
        content = Faker::Lorem.sentence(5)
        users.each { |user| user.microposts.create!(content: content) }
      end
    end
  end
end

【问题讨论】:

  • 您正在尝试使用电子邮件 example@railstutorial.org 创建两个用户,并对用户模型进行验证。只需从 rake 文件中删除其中一个即可。
  • @Baloo 通过 rake 文件你的意思是 sample_data.rake 吗?还是 Rakefile?

标签: ruby-on-rails ruby activerecord railstutorial.org


【解决方案1】:
admin = User.create!(name: "Example User",
  email: "example@railstutorial.org",
  password: "foobar",
  password_confirmation: "foobar",
  admin: true)

User.create!(name: "Example User",
  email: "example@railstutorial.org", # This email is used to create admin above.
                                      # Use another email here
  password: "foobar",
  password_confirmation: "foobar")

错误来自这一行

users = User.all(limit: 6)

活动记录方法all 不接受任何参数。改成

users = User.limit(6)

【讨论】:

  • 您好,我这样做了,但出现参数错误:参数数量错误(1 代表 0)
  • 从哪一行开始,那一行的代码是什么。错误消息的意思是,您正在调用一个带有 1 个参数的方法,但它并不期望任何参数。
  • 这是错误!耙中止! ArgumentError:参数数量错误(1 代表 0)/home/action/.gem/ruby/2.0.0/gems/activerecord-4.1.1/lib/active_record/scoping/named.rb:24:in all' /home/action/workspace/app3/lib/tasks/sample_data.rake:22:in block (3 个级别)在 ' /action/workspace/app3/lib/tasks/sample_data.rake:14:in `times'
【解决方案2】:

很可能,您已经解决了这个问题,我也遇到了这个问题,并通过在模型文件中添加attr_accessible :content 或其他attr_accessible 来解决它。我希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多