2014-10-30 13 views
18

Aggiornamento 3: Sembra che questo sia specifico per le fixture in un file .yml.erb - anche se non ho codice basato su modelli, sembra che le fixture in un file yml.erb non vengano caricate. Avere un semplice file .yml funziona. Questo probabilmente non ha nulla a che fare con l'idea di per sé.Come creare proiettori (per un utente di Devise) come yml.erb in rails (4.1.5)?

Nota: vedere Update 3 annotazioni di modifiche rilevanti

ho bisogno di generare gli utenti Devise nella mia applicazione Rails. Ho notato che la cancellazione del database e il caricamento degli apparecchi carica tutti gli altri proiettori, eccetto gli utenti di Devise (Update 3: che si trova in un file .yml.erb).

Ho visto this other thread, ma ho provato tutte le opzioni lì e ancora non sembra caricare i proiettori.

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

E dalla console:

Per cancellare il test db:

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

per caricare i dispositivi in ​​prova db:

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

Run rotaie console di prova (non sono stati trovati utenti, ma sono stati caricati altri dispositivi di modello, come l'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,...> 

Update 1: provato anche passando password crittografata generata dalla console, ancora nessun record utente vengono trovati:

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

Update 2: Funziona quando ho rinominare il file infissi per gli utenti. yml. Rinominare in users.yml.erb sembra essere il colpevole. A proposito, lo stesso comportamento è visto (cioè funziona con .yml, ma non con yml.erb) sulla console e da rake test

risposta

21

Si dovrebbe passare la password anche in testo normale. Sono sicuro che ci sono errori di validazione del modello utente che impediscono la creazione degli utenti del dispositivo. Ecco un esempio dal mio apparecchio utenti che funziona:

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

Se il problema persiste, si prega di controllare il file log/test.log per gli errori e verificare la presenza di campi richiesti o altre regole di convalida impostato nel modello User mancante.

Aggiornamento: Si scopre che autore ha trovato il problema stesso - usato estensione .yml.erb piuttosto che .yml che ha reso rotaie bypassare quel file fixture. ERB funziona in infissi yml mentre rails esegue il file fixture tramite ERB prima di analizzarlo.

+0

Grazie, ho aggiornato la questione e dettagli sulla base di ulteriori indagini - sembra questo è legato ai file .yml.erb non caricati, non specifici per l'ideazione. Vedi i miei aggiornamenti nel titolo della domanda e dettagli. – Anand

+0

Sì, non hai bisogno dell'estensione .erb, erb sta lavorando in fixtures anche se sono solo file .yml perché i rails li elaborano tramite ERB prima di caricarli. – kroky

+0

Sì, è così! Sono nuovo per i dispositivi e ho pensato che fosse necessaria un'estensione erb, proprio come i file di visualizzazione contenenti il ​​codice erb. Grazie! Si prega di aggiornare la risposta con questo, e ti darò tutto il buon karma che posso :-) – Anand

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

È un modo alternativo per fare la stessa cosa, non è necessario creare una nuova istanza.

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

edit:

Grazie @ sixty4bit per indicare l'utilizzo deprecato, la risposta aggiornato sarebbe:

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

Si prega di inviare almeno alcuni commenti a spiega il tuo codice –

+0

Grazie per il tuo ricordo. –

+7

Nota che 'Devise.bcrypt()' è deprecato. La gemma ora avvisa di questo e raccomanda l'uso di 'Devise :: Encryptor.digest()' (lo vedo nella versione 3.5.1) – sixty4bit

Problemi correlati