Rails - 用nil而不是值来播种数据库

时间:2016-09-28 22:36:02

标签: ruby-on-rails ruby-on-rails-4

我在Rails 4.2.3中创建了一个应用程序 我试图种子数据库,但在我做了rake db:migrate之后,我在数据库表的字段中得到了nil值。我在seeds.rb中唯一的代码是:

    User.create![{username: "test", password_digest: "test"}]

在我的schema.rb中,我有:

    create_table "users", force: :cascade do |t|
      t.string   "username"
      t.string   "password_digest"
      t.datetime "created_at",      null: false
      t.datetime "updated_at",      null: false
    end

我的用户模型是:

      class User < ActiveRecord::Base
        has_one :profile, dependent: :destroy
        has_many :todo_lists, dependent: :destroy
        has_many :todo_items, through: :todo_lists, source: :todo_items
      end

还有其他人遇到了同样的问题,例如herehere,但我不认为解决方案适用于我的情况,因为我的任何模型中都没有任何attr_accessor。

任何人都知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

大括号类型......

使用以下代替

User.create!( username: "test", password_digest: "test" )

这告诉rails创建一个用户,使用包含用户名“test”和密码“test”的哈希

你所拥有的是告诉rails创建一个包含散列[]的数组{}的用户......但是create不期望散列数组 - 它只需要一个散列。

编辑:重新:使用[]

那是因为当你不使用()但使用[]时,那么ruby必须猜测你的意思...... 您是将数组传递给方法还是在变量上调用数组索引方法? (如果括号中不是整数,则为哈希索引)?

如果你将[]放在单词create!旁边(例如User.create![]),ruby可能会将其解释为后者...例如,它正在寻找{ {1}}类调用User ...然后尝试查找名为create!的哈希的键,然后它变得混乱,因为当您使用数组索引方法{username: "test", password_digest: "test"}, {username: "test2", password_digest: "test2"}时你应该只传递一个键来找到,而不是两个([]是第一个而{username: "test", password_digest: "test"}是第二个)...因此给你错误,你正在尝试传递2个参数而不是一个...但也只是使用错误的解释开始。

这两者都不是你想要的......

如果在{username: "test2", password_digest: "test2"}[]之间留一个空格,那么ruby更有可能将create!解释为传递给方法的参数...然后它会触发一个不同的错误。

明确无误 - 总是使用空格......或者在传递可能不明确的参数时使用parens []