Ruby on rails 如何在rails(4.1.5)中创建作为yml.erb的夹具(针对Desive用户)?

Ruby on rails 如何在rails(4.1.5)中创建作为yml.erb的夹具(针对Desive用户)?,ruby-on-rails,erb,fixtures,Ruby On Rails,Erb,Fixtures,更新3:这似乎是特定于.yml.erb中的装置-即使我没有模板化代码,也似乎没有加载yml.erb文件中的装置。拥有一个普通的.yml文件是可行的。这可能与设计本身无关 注:有关更改,请参见更新3注释 我需要在rails应用程序中生成Desive用户。我注意到,清除数据库并加载fixture会加载除designe用户之外的所有其他fixture(update3:位于.yml.erb文件中) 我看到了,但我尝试了所有的选项,仍然没有加载设备 # ../fixtures/users.yml.erb

更新3:这似乎是特定于.yml.erb中的装置-即使我没有模板化代码,也似乎没有加载yml.erb文件中的装置。拥有一个普通的.yml文件是可行的。这可能与设计本身无关

注:有关更改,请参见更新3注释

我需要在rails应用程序中生成Desive用户。我注意到,清除数据库并加载fixture会加载除designe用户之外的所有其他fixture(update3:位于.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
要将夹具加载到测试数据库中,请执行以下操作:

$ bundle exec rake db:fixtures:load RAILS_ENV=test
在测试中运行rails控制台(未找到用户,但正在加载其他模型装置,如应用程序):


更新2:当我将fixtures文件重命名为users.yml时,它会起作用。改名为users.yml.erb似乎是罪魁祸首。顺便说一句,在控制台上可以看到相同的行为(即,它与.yml一起工作,但与yml.erb不一起工作),并且从
rake test

您也应该以纯文本形式传递密码。我确信存在用户模型验证错误,无法创建夹具用户。下面是一个来自我的用户装置的示例,它可以工作:

tom:
  first_name: Tom
  last_name: Test
  email: test@example.org
  password: 123greetings
  encrypted_password: <%= User.new.send(:password_digest, '123greetings') %>
汤姆: 名字:汤姆 姓氏:Test 电邮:test@example.org 密码:123 加密密码: 如果仍然失败,请检查
log/test.log
文件中是否有错误,并检查是否缺少必填字段或您在用户模型中设置的其他验证规则

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

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

感谢@sixty4bit指出不推荐的用法,更新后的答案是:

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

用户:
电邮:
加密密码:
管理员:
身份证号码:1
名字:管理员
姓氏:tukaweb
电邮:'admin@email.com'
加密密码:
电话:9541555660
常规:
身份证号码:2
名字:维杜尔
姓氏:庞吉
电子邮件:“维德。punj@hotmail.com'
加密密码:
电话:9541555660

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

例如:

# ../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
#../fixtures/users.yml.erb
用户1:
电邮:user1@mysite.com
姓名:user1
加密密码:
管理员:是的
用户2:
电邮:user2@mysite.com
姓名:user2
加密密码:
管理员:错

希望有帮助

谢谢,我已根据进一步调查更新了问题和详细信息-似乎这与未加载的.yml.erb夹具文件有关,不是专门设计的。在问题标题和详细信息中查看我的更新。是的,您不需要.erb扩展名,erb在fixture中工作,即使它们只是.yml文件,因为rails在加载之前通过erb处理它们。是的,就是这样!我不熟悉fixture,并假设它需要一个erb扩展名,就像包含erb代码的视图文件一样。谢谢请用这个更新回复,我会尽我所能给你报应:-)@Anand,谢谢,但是你找到了答案,所以我认为你应该得到好处:)谢谢!我接受了你的回答,因为你的评论证实了我的怀疑。顺便说一句,如果fixtures系统接受.yml.erb扩展以保持一致性,那不是很好吗?请至少发表一些评论来解释您的代码注意
designe.bcrypt()
已被弃用。gem现在对此发出警告,并建议使用
design::Encryptor.digest()
(我在3.5.1版中看到了这一点)
<% 100.times do |n| %>
user_<%= n %>:
  email: <%= "user#{n}@example.com" %>
  encrypted_password: <%= Devise.bcrypt(User, 'password') %>
<% end %>
# lib/devise/models/database_authenticatable.rb:147
def password_digest(password)
  Devise.bcrypt(self.class, password)
end
<% 100.times do |n| %>
user_<%= n %>:
  email: <%= "user#{n}@example.com" %>
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
<% end %>
admin:
 id: 1
 first_name: admin
 last_name: tukaweb
 email: 'admin@email.com'
 encrypted_password: <%= User.new.send(:password_digest, 'admin@123') %>
 phone: 9541555660

regular:
 id: 2
 first_name: vidur
 last_name: punj
 email: 'vidur.punj@hotmail.com'
 encrypted_password: <%= User.new.send(:password_digest, 'punj@123') %>
 phone: 9541555660
# ../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