我在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
还有其他人遇到了同样的问题,例如here和here,但我不认为解决方案适用于我的情况,因为我的任何模型中都没有任何attr_accessor。
任何人都知道为什么会发生这种情况?
答案 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 []
。