Les utilisateurs de semis avec Devise dans Ruby on Rails

dans mes environnements de développement et de test, je veux semer la base de données avec un groupe d'utilisateurs. J'utilise Ruby sur Rails v3.2.8 et la dernière Devise. J'ai donc ajouté cette ligne dans mon db/seeds.rb fichier:

User.create(email: 'test@example.com', encrypted_password: '#$taawktljasktlw4aaglj')

Cependant, lorsque je lance rake db:setup, j'obtiens l'erreur suivante:

râteau abandonnée! Ne peut pas masquer-attribuer des attributs protégés: crypted_password

Quelle est la bonne façon de semences utilisateurs?

20
demandé sur at. 2012-09-14 09:22:55

11 réponses

Vous devez faire comme ceci:

user = User.new
user.email = 'test@example.com'
user.encrypted_password = '#$taawktljasktlw4aaglj'
user.save!

lisez ce guide pour comprendre ce qu'est une tâche de masse:http://guides.rubyonrails.org/security.html

je me demande pourquoi il faut mettre directement le mot de passe crypté. Vous pourriez faire ceci:

user.password = 'valid_password'
user.password_confirmation = 'valid_password'
36
répondu Arun Kumar Arjunan 2012-09-14 05:29:14

Arun a raison. Il est plus facile de le faire dans vos graines.rb

user = User.create! :name => 'John Doe', :email => 'john@gmail.com', :password => 'topsecret', :password_confirmation => 'topsecret'
25
répondu George 2012-09-14 07:13:20

la méthode Skip comfirmation ne fonctionnera que si vous avez un module conforme dans votre modèle utilisateur sinon supprimez-le

  user = User.new(
      :email                 => "admin@xxxxx.xxx",
      :password              => "123456",
      :password_confirmation => "123456"
  )
  user.skip_confirmation!
  user.save!
11
répondu Muhammad Sannan Khalid 2012-09-14 07:21:53

C'est une vieille question, mais voici un exemple avec un utilisateur administrateur (à partir de cancancan):

User.create!([
  {email: "testadmin@mvmanor.co.uk", password: "testadminuser", password_confirmation: "testadminuser", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:02:10", last_sign_in_at: "2015-02-06 14:02:10", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: true},
  {email: "testuser@mvmanor.co.uk", password: "testuseraccount", password_confirmation: "testuseraccount", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:03:01", last_sign_in_at: "2015-02-06 14:03:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: false},
  {email: "testcustomer@customer.co.uk", password: "testcustomeruser", password_confirmation: "testcustomeruser", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:03:44", last_sign_in_at: "2015-02-06 14:03:44", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: false}
])
7
répondu Koxzi 2015-04-14 07:48:01

Si vous utilisez le dispositif confirmable module dont vous avez besoin pour faire quelque chose comme:

user = User.new(
  email: 'user@domain.com', 
  password: '123456789', 
  password_confirmation: '123456789'
)
user.skip_confirmation!
user.save!

skip_confirmation! appelez juste dire pour concevoir que vous n'avez pas besoin de confirmer ce compte.

L'autre option est de définir le confirmed_at attribut utilisateur Time.now.utc avant de l'enregistrer.

5
répondu Victor 2016-04-15 12:35:07

Pour les semences de la table users:

User.create(
        email: "example@gmail.com",
        password: "12345678"
    )

concevoir installé, le :password sera automatiquement hashé et sauvegardé sur :encrypted_password

3
répondu doncadavona 2016-02-05 02:47:06

Je ne sais pas si ça peut aider mais en fait je fais ça pour créer un administrateur par défaut dans mon Rails 5 app mais sans partager le mot de passe en clair dans mon dépôt GitHub.

Fondamentalement, la logique est la suivante:

  • générer un mot de passe aléatoire sécurisé pour l'utilisateur par défaut lors de la sélection.
  • ".../ admins / sign_in" et cliquez sur " mot de passe oublié?" lien pour RÉINITIALISER.
  • Get réinitialiser le mot de passe lien dans ce compte email par défaut.
  • Définir un nouveau mot de passe.

dans le db/seeds.rb ajouter ce qui suit:

randomPassword = Devise.friendly_token.first(8)
mainAdminUser = Admin.create!(email: "me@gmail.com", password: randomPassword, name: "Username")

Et si vous utilisez concevoir confirmable il suffit de sauter l'option confirmable en faisant ceci:

mainAdminUser = Admin.new(
    email: "me@gmail.com",
    password: randomPassword,
    password_confirmation: randomPassword,
    name: "Username"
)
mainAdminUser.skip_confirmation!
mainAdminUser.save!

Et votre bon d'aller!

Maintenant vous avez un utilisateur par défaut mais vous ne partagez pas un mot de passe par défaut! J'espère que cela pourrait être utile pour quelqu'un.

3
répondu Alex Ventura 2017-02-04 23:20:48

pour les utilisateurs de devise dans seeds.RB file, ce qui a fonctionné pour moi était d'utiliser un mot de passe générique lors de la sauvegarde du nouvel utilisateur. Puis mettre à jour le mot de passe crypté et enregistrer le modèle. C'était un hacky.

user = User.new(
    :email                 => "admin@xxxxx.xxx",
    :password              => "fat12345",
    :password_confirmation => "fat12345"
)
user.save!
user.encrypted_password="ENCRYPT.MY.ASS!!!KJASOPJ090923ULXCIULSH.IXJ!S920"
user.save

mise à JOUR publiés par d'autres et c'est la meilleure manière de le faire:

user = User.new(
    email: "foo@bar.com", 
    password: "foob1234", 
    password_confirmation: "foob1234"
)
user.skip_confirmation! #only if using confirmable in devise settings in user model.
user.save!
1
répondu lacostenycoder 2018-03-06 00:24:55

j'ai fait quelque chose de même dans l'une de mes exigences alors il suffit de coller mon snippet

def triggerSeedUsers
      p "Starting Seeding Users..."
      p   "Deleting all users"..
      User.destroy_all
      normal_users = [{:email => 'abc@domain.com', :login => "abc_demo", :name => 'abc Demo'}]
      admin_users = [{:email => 'admin@domain.com', :login => 'abc_admin', :name => 'abc Admin'}]

      [normal_users,admin_users].each do |user_type|
        user_type.each do |user|
          User.create!(:name => user[:name],
            :login => user[:login],
            :email => user[:email],
            :first_login => false,
            :password => 'P@ssw0rd',
            :password_confirmation => 'P@ssw0rd'
            )
        end
      end
      User.where('name LIKE ?', '%demo%').update_all(:is_admin => 0)
      User.where('name LIKE ?', '%admin%').update_all(:is_admin => 1)
     end
0
répondu AnkitG 2012-09-14 07:20:09

Utilisez votre db / seeds.rb fichier pour lancer votre premier utilisateur:

User.create!(email: 'palo@alto.com', 
             password: '123456789', 
             password_confirmation: '123456789')
0
répondu aloucas 2014-08-14 16:35:43

par e-mail confirmating en db:graine :

User.create!( name: 'John', email:'john@hotmail.com', password: '123456', password_confirmation: '123456',confirmed_at: '2018-08-04 04:51:43', current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1")
0
répondu vidur punj 2018-08-04 05:31:02