【问题标题】:NoMethodError: undefined method `create!' for #<ActiveRecord::Migration:0x00007fffe712ed20> while creating Users migrationNoMethodError:未定义的方法“创建!”在创建用户迁移时用于#<ActiveRecord::Migration:0x00007fffe712ed20>
【发布时间】:2019-10-13 05:14:31
【问题描述】:

我正在创建一个基本的用户迁移,我正在尝试使用 Faker gem 为其播种,当我执行 rake db:repopulate(即 db:drop、db:create、db:migrate、db:seed)时它一直在 db:seed 失败。我得到一个 NoMethodError: undefined method `create!'对于#,问题是它似乎创建了一个用户,但随后它失败了,我似乎可以理解为什么..我在一个类似的项目中做了同样的事情并且没有遇到这个错误,我已经检查了类似的问题和一直没能解决。

我首先认为这是可能导致迁移和任务/db.rake 出现问题的名称,所以我修复了它,但它没有改变,然后我尝试使用迁移约定的名称,但效果不佳.

20191013045256_create_users.rb:

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :email                
      t.string :encrypted_password 
      t.timestamps
    end
  end
end

schema.rb:

ActiveRecord::Schema.define(version: 2019_10_13_045256) do

  create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "email"
    t.string "encrypted_password"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

tasks/db.rake:

require 'faker'
require 'bcrypt'

namespace :db do
  desc "Drop, create, migrate, seed and repopulate with sample data"
  task repopulate: [:drop, :create, :migrate, :seed, :fakeit] do
  puts "Done"
end

  desc "TODO"
  task fakeit: :environment do
    10.times do
      CreateUsers.create!(
        email: Faker::Internet.email,
        encrypted_password: BCrypt::Password.create(Faker::Internet.password)
      )
  end
end
end

我希望在我的数据库中为用户迁移创建 10 个用户,但我得到了这个 NoMethodError: undefined method `create!'

【问题讨论】:

  • User.create! 代替? CreateUsers 是什么?服务?
  • 我试过了,还是一样的错误

标签: ruby-on-rails migration faker


【解决方案1】:

错误消息NoMethodError: undefined method 'create!' for #&lt;ActiveRecord::Migration:0x00007fffe712ed20&gt; 表示您尝试在迁移上调用create! 方法,而不是在User 模型上。

迁移文件的任务是在您的数据库中简单地创建所需的表。在这种情况下,您希望填充由迁移文件创建的 User 模型的记录。因此,您必须在生成的模型上调用 create! 方法,而不是迁移。请将CreateUsers.create! 行更改为User.create!(&lt;your params&gt;)。那应该行得通。

注意:请在编写迁移后运行rake db:migrate,以防万一(您可能已经这样做了,因为users 表出现在架构中)。

【讨论】:

  • 通过使用设计并删除用户模型上的可验证对象,我已经能够 db:repopulate 并且当然也更改为 User.create.. 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2021-09-24
相关资源
最近更新 更多