Подтвердить что ты не робот

Как создать светильники (для пользователя 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

4b9b3361

Ответ 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 %>