【问题标题】:How to create fixtures (for a Devise user) as a yml.erb in rails (4.1.5)?如何在 rails (4.1.5) 中创建固定装置(对于 Devise 用户)作为 yml.erb?
【发布时间】:2014-12-26 00:07:19
【问题描述】:

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

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

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

我见过this other thread,但我尝试了那里的所有选项,但似乎仍然没有加载固定装置。

# ../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:schema:load RAILS_ENV=test

将夹具加载到测试数据库中:

$ bundle exec rake db:fixtures:load RAILS_ENV=test

在测试中运行 rails 控制台(未找到用户,但正在加载其他模型夹具,例如 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,...>

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

admin:
  email: user1@mysite.com
  name: user1
  encrypted_password: $2a$04$DR0.2yfWwD8AZlyeXx0gEuk2Qh.cNLF4cir0ZUB1iW7hwQhK/IfcC
  admin: true

更新 2:当我将固件文件重命名为 users.yml 时,它可以工作。重命名为 users.yml.erb 似乎是罪魁祸首。顺便说一句,在控制台和rake test

上看到了相同的行为(即,它适用于 .yml,但不适用于 yml.erb)

【问题讨论】:

    标签: ruby-on-rails erb fixtures


    【解决方案1】:

    您也应该以纯文本形式传递密码。我确信有一个用户模型验证错误会阻止您的夹具用户被创建。这是我的 users 固定装置的一个例子:

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

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

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

    【讨论】:

    • 谢谢,我已经根据进一步调查更新了问题和详细信息 - 似乎这与未加载的 .yml.erb 夹具文件有关,而不是特定于设计。在问题标题和详细信息中查看我的更新。
    • 是的,您不需要 .erb 扩展名,即使它们只是 .yml 文件,erb 也在夹具中工作,因为 rails 在加载之前通过 erb 处理它们。
    • 是的,就是这样!我是灯具的新手,并假设它需要一个 erb 扩展,就像包含 erb 代码的视图文件一样。谢谢!请用这个更新回复,我会尽我所能给你所有的好业力:-)
    • @Anand,谢谢,但你找到了答案,所以我认为你应该得到好东西 :)
    • 谢谢!我接受了你的回答,因为你的评论证实了我的怀疑。顺便说一句,如果夹具系统接受 .yml.erb 扩展以保持一致性,那不是很好吗?
    【解决方案2】:
    <% 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
    

    编辑:

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

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

    【讨论】:

    • 请至少发布一些 cmets 来解释您的代码
    • 请注意,Devise.bcrypt() 已弃用。 gem 现在对此发出警告并建议使用Devise::Encryptor.digest()(我在 3.5.1 版本中看到了这个)
    【解决方案3】:

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

    例子:

    # ../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
    

    希望有帮助!

    【讨论】:

    • 是的!谢谢!
    【解决方案4】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 2022-11-17
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多