如何在rails(4.1.5)中为yml.erb创建fixtures(对于Devise用户)?

Ana*_*and 23 ruby-on-rails erb fixtures

更新3:看起来这是特定于.yml.erb中的灯具 - 即使我没有模板化代码,似乎yml.erb文件中的灯具也没有加载.有一个简单的.yml文件.这可能与设计本身无关.

注意:请参阅更新3注释以了解相关更改

我需要在我的rails应用程序中生成Devise用户.我注意到清除数据库和加载灯具会加载除Devise用户之外的所有其他灯具(Update 3:在.yml.erb文件中).

我已经看到了这个其他线程,但我尝试了所有选项,但似乎仍然没有加载灯具.

# ../fixtures/users.yml.erb
user1:
  email: user1@mysite.com
  name: user1
  encrypted_password: <%= Devise.bcrypt(User, 'passw0rd!') %>
  # also tried encrypted_password: User.new(password_salt: '$2a$10$PoBe1MvkoGJsjMVTEjKqge').send(:password_digest, 'somepassword')
  admin: true
Run Code Online (Sandbox Code Playgroud)

从控制台:

要清除测试db:

$ bundle exec rake db:schema:load RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

要将灯具加载到测试db中:

$ bundle exec rake db:fixtures:load RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

在测试中运行rails console(未找到用户,但正在加载其他模型装置,如App):

$ rails c test
Loading test environment (Rails 4.1.5)
irb(main):001:0> User.first
  User Load (0.1ms)  SELECT  "users".* FROM "users"   ORDER BY "users"."id" ASC LIMIT 1
=> nil
irb(main):002:0> App.first
  App Load (0.1ms)  SELECT  "apps".* FROM "apps"   ORDER BY "apps"."id" ASC LIMIT 1
=> #<App id: 953336129,...>
Run Code Online (Sandbox Code Playgroud)

更新1:还尝试传入从控制台生成的加密密码,仍未找到用户记录:

admin:
  email: user1@mysite.com
  name: user1
  encrypted_password: $2a$04$DR0.2yfWwD8AZlyeXx0gEuk2Qh.cNLF4cir0ZUB1iW7hwQhK/IfcC
  admin: true
Run Code Online (Sandbox Code Playgroud)

更新2:当我将fixtures文件重命名为users.yml时,它可以正常工作.重命名为users.yml.erb似乎是罪魁祸首.顺便说一下,在控制台上可以看到相同的行为(也就是说,它与.yml一起使用,但不能与yml.erb一起使用)rake test

kro*_*oky 26

您也应该以纯文本形式传递密码.我确信有一个用户模型验证错误会阻止您的夹具用户被创建.以下是我的用户夹具的示例:

tom:
  first_name: Tom
  last_name: Test
  email: test@example.org
  password: 123greetings
  encrypted_password: <%= User.new.send(:password_digest, '123greetings') %>
Run Code Online (Sandbox Code Playgroud)

如果仍然失败,请检查log/test.log文件是否有错误,并检查是否缺少必填字段或您在用户模型中设置的其他验证规则.

更新: 事实证明作者自己发现了这个问题 - 使用.yml.erb文件扩展名而不是.yml,这使得rails绕过了fixtures文件.ERB在yml fixture中工作,因为rails在解析之前通过ERB运行fixture文件.


Wil*_*ire 9

由于所有这些答案都相当混乱或过时,最新的答案是您需要使用它Devise::Encryptor.digest来创建加密的密码。

例子:

# ../fixtures/users.yml.erb
user1:
  email: user1@mysite.com
  name: user1
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
  admin: true

user2:
  email: user2@mysite.com
  name: user2
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
  admin: false
Run Code Online (Sandbox Code Playgroud)

希望有帮助!


Jia*_*ang 7

<% 100.times do |n| %>
user_<%= n %>:
  email: <%= "user#{n}@example.com" %>
  encrypted_password: <%= Devise.bcrypt(User, 'password') %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这是另一种做同样事情的方法,你不需要新的实例.

# lib/devise/models/database_authenticatable.rb:147
def password_digest(password)
  Devise.bcrypt(self.class, password)
end
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢@ sixty4bit指出已弃用的用法,更新后的答案是:

<% 100.times do |n| %>
user_<%= n %>:
  email: <%= "user#{n}@example.com" %>
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,不推荐使用`Devise.bcrypt()`.宝石现在警告这个并建议使用`Devise :: Encryptor.digest()`(我在版本3.5.1中看到了这一点) (10认同)