Как создать светильники (для пользователя Devise) как yml.erb в рельсах (4.1.5)?
Обновление 3. Похоже, что это специфично для светильников в .yml.erb - даже если у меня нет шаблонного кода, похоже, что в файле yml.erb ничего не получается загружен. Имеет простой файл .yml. Это, вероятно, не имеет никакого отношения к разработке как таковой.
Примечание: см. Обновление аннотаций 3 для соответствующих изменений
Мне нужно создать пользователей Devise в моем приложении rails. Я замечаю, что очистка базы данных и загрузка светильников загружают все другие приборы, кроме пользователей Devise (Обновление 3), которое находится в файле .yml.erb).
Я видел этот другой поток, но я попробовал все варианты там и по-прежнему не загружал светильники.
# ../fixtures/users.yml.erb
user1:
email: [email protected]
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
И с консоли:
Чтобы очистить тест db:
$ bundle exec rake db:schema:load RAILS_ENV=test
Чтобы загрузить приборы в тест db:
$ 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: [email protected]
name: user1
encrypted_password: $2a$04$DR0.2yfWwD8AZlyeXx0gEuk2Qh.cNLF4cir0ZUB1iW7hwQhK/IfcC
admin: true
Обновление 2. Оно работает, когда я переименую файл fixtures на users.yml. Кажется, что переименование в user.yml.erb является виновником. BTW, такое же поведение наблюдается (то есть, оно работает с .yml, но не с yml.erb) на консоли и от rake test
Ответы
Ответ 1
Вы также должны передать пароль в виде обычного текста. Я уверен, что есть ошибки проверки модели пользователя, которые не позволяют создавать ваши устройства. Вот пример моего рабочего устройства, который работает:
tom:
first_name: Tom
last_name: Test
email: [email protected]
password: 123greetings
encrypted_password: <%= User.new.send(:password_digest, '123greetings') %>
Если он все еще не работает, проверьте файл log/test.log
на наличие ошибок и проверьте отсутствие необходимых полей или других правил проверки, установленных в вашей модели пользователя.
Update:
Оказывается, автор сам нашел проблему - использовал расширение .yml.erb, а не .yml, что заставило рельсы обойти этот файл настроек. ERB работает в 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 %>