2014-10-30 23 views
18

Update 3: Es scheint, dass dies für Fixtures in einer .yml.erb spezifisch ist - auch wenn ich keinen Template-Code habe, scheint es, dass Fixtures in einer Yml.erb-Datei nicht geladen werden. Eine einfache .yml-Datei funktioniert. Dies hat wahrscheinlich nichts mit der Entwicklung an sich zu tun.Wie erstellt man Fixtures (für einen Devise-Benutzer) als yml.erb in Rails (4.1.5)?

Hinweis: siehe Update 3 Anmerkungen für relevante Änderungen

Ich brauche Devise Benutzer in meiner Rails-Anwendung zu generieren. Ich merke, dass das Löschen der Datenbank und das Laden der Fixtures alle anderen Fixtures lädt, außer den Devise-Benutzern (Update 3: welches in einer .yml.erb-Datei ist).

Ich habe this other thread gesehen, aber ich habe alle Optionen dort versucht und scheint immer noch nicht die Geräte zu laden.

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

Und von der Konsole:

den Test db zu löschen:

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

Um die Geräte in dem Test db zu laden:

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

Laufschienen Konsole in Test (keine Benutzer gefunden, aber andere Modell Fixtures, wie App, werden geladen):

$ 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,...> 

Update 1: versuchten auch in verschlüsseltem Passwort von der Konsole erzeugt vorbei, noch keine Benutzerdatensätze gefunden:

admin: 
    email: [email protected] 
    name: user1 
    encrypted_password: $2a$04$DR0.2yfWwD8AZlyeXx0gEuk2Qh.cNLF4cir0ZUB1iW7hwQhK/IfcC 
    admin: true 

Update 2: Es funktioniert, wenn ich Fixtures Benutzer-Datei umbenannt. Yml. Umbenennung in users.yml.erb scheint der Täter zu sein. BTW, das gleiche Verhalten wird gesehen (das heißt, es funktioniert mit .yml, aber nicht mit yml.erb) auf der Konsole und von rake test

Antwort

21

Sie sollten das Passwort auch im Klartext übergeben. Ich bin mir sicher, dass es Fehler bei der Validierung des Benutzermodells gibt, die verhindern, dass Ihre Fixture-Benutzer erstellt werden. Hier ist ein Beispiel aus meiner Benutzer Leuchte, die funktioniert:

tom: 
    first_name: Tom 
    last_name: Test 
    email: [email protected] 
    password: 123greetings 
    encrypted_password: <%= User.new.send(:password_digest, '123greetings') %> 

Wenn es immer noch nicht, bitte die log/test.log Datei auf Fehler überprüfen und prüfen, ob fehlenden Pflichtfelder oder andere Validierungsregeln, die Sie in Ihrem Benutzermodell festgelegt.

Update: Es stellt sich heraus, dass Autor das Problem selbst gefunden - verwendet eher .yml.erb Dateierweiterung .yml als die Schienen gemacht umgehen, dass Vorrichtungen Datei. ERB funktioniert in YML-Fixtures, da rails die Fixture-Datei über ERB ausführt, bevor sie analysiert wird.

+0

Danke, ich aktualisiert die Frage und Details auf der Grundlage weiterer Untersuchungen - scheint wie Dies hängt damit zusammen, dass .yml.erb-Fixture-Dateien nicht geladen werden, nicht speziell für Geräte. Sehen Sie sich meine Updates im Titel und in den Details der Frage an. – Anand

+0

Ja, Sie benötigen nicht die Erweiterung .erb, erb funktioniert in Fixtures, auch wenn sie nur .yml-Dateien sind, weil Schienen sie über erb vor dem Laden verarbeitet. – kroky

+0

Ja, das ist es! Ich bin neu bei Fixtures und nehme an, dass es eine Erweiterung von erb benötigt, genau wie View-Dateien, die Erb-Code enthalten. Vielen Dank! Bitte aktualisieren Sie die Antwort mit diesem, und ich gebe Ihnen all das gute Karma, das ich kann :-) – Anand

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

Es ist eine alternative Möglichkeit, das gleiche zu tun, Sie müssen nicht eine neue Instanz.

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

edit:

Dank @ sixty4bit für veraltete Verwendung unter Hinweis darauf, würde die aktualisierte Antwort:

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

Bitte senden Sie zumindest einige Kommentare zu erklären Sie Ihren Code –

+0

Danke für Ihre Erinnerung. –

+7

Beachten Sie, dass 'Devise.bcrypt()' veraltet ist. Der Edelstein warnt jetzt davor und empfiehlt 'Devise :: Encryptor.digest()' zu verwenden (ich sehe das in Version 3.5.1) – sixty4bit