Rails 4.1 Devise 3.3中,用户密码列不存在。

7
我希望通过控制台手动创建用户,如下所示:

我要通过如下命令在Linux系统中创建一个新用户:

User.find_or_create_by(email: "user@mail.com", first_name: "Stan", last_name: "Smith", password: "password", password_confirmation: "password", confirmed_at: Time.now)

我以前在其他项目中多次这样做过,但这次不起作用。它没有获取到Devise密码模型属性,所以我得到了以下错误:
PG::UndefinedColumn: ERROR:  column users.password does not exist

我有Rails 4.1.4和Devise 3.3.0。最新版本中是否有任何更改?
谢谢。
2个回答

16

不要使用User.find_or_create_by,而应该使用User.create

在创建时,Devise接受密码和密码确认,但实际表只有一个名为encrypted_password的列。

User.find_or_create_by中的“find”部分正在查找一个名为“password”的列,但该列不存在。


是的,你说得对!现在它可以工作了 :) 谢谢。它曾经在Rails 4.0.2中工作过。我猜他们改变了一些东西。 - Maher Manoubi
没问题,很乐意帮忙! - AJ Gregory
1
如果意外地创建/种子多次,这会创建多个但相同的用户吗?因为我认为find_or_create_by的目的正是为了避免这种情况。 - wlnirvana
1
@wlnirvana 这取决于几个因素,例如是否有模型验证来防止重复。否则,请参考Sharvy Ahmed在此问题上的答案以获得另一种方法。 - AJ Gregory

15

如果您仍然想使用find_or_create_by,它支持块:

User.find_or_create_by(email: "user@mail.com", first_name: "Stan", last_name: "Smith") do |user|
  user.password = "password"
  user.confirmed_at = Time.now
end

哇,这正是我在过去18个月的Rails开发中一直在寻找的东西!感谢您的分享。(对我来说,这应该是最佳答案) - samjewell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接