Rails uniqueness email

40 views
Skip to first unread message

Jeremy Montesinos

unread,
Mar 17, 2015, 3:43:22 PM3/17/15
to rubyonra...@googlegroups.com
Salut à tous,

je suis en train de créer une application avec Rails 4.2. J'ai un souci d'unicité. Je voudrais vérifier qu'une adresse email n'est pas en double dans la base de données et voici comment je fais :

app/models/users.rb

# == Schema Information
#
# Table name: users
#
#  id         :integer          not null, primary key
#  nom        :string
#  email      :string
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class User < ActiveRecord::Base
  attr_accessor
:nom, :email

  email_regex
= /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates
:nom, presence: true, length: {maximum: 50}
  validates
:email, presence: true, format: {with: email_regex}, uniqueness: true
end

db/migrate/20150317112639_add_email_uniqueness_index.rb :
class AddEmailUniquenessIndex < ActiveRecord::Migration
 
def self.up
    add_index
:users, :email, unique: true
 
end

 
def self.down
    remove_index
:users, :email
 
end
end

spec/models/user_spec.rb :
# == Schema Information
#
# Table name: users
#
#  id         :integer          not null, primary key
#  nom        :string
#  email      :string
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

require 'rails_helper'

RSpec.describe User, type: :model do
  before
(:each) do
   
@attr = {nom: "Example User", email: "us...@example.com"}
 
end

  it
"doit créer une nouvelle instance avec des attributs valides" do
   
User.create!(@attr)
 
end

  it
"devrait exiger un nom obligatoire" do
    bad_guy
= User.new(@attr.merge(nom: ""))
    bad_guy
.should_not be_valid
 
end

  it
"devrait exiger une adresse email obligatoire" do
    bad_guy
= User.new(@attr.merge(email: ""))
    bad_guy
.should_not be_valid
 
end

  it
"devrait rejeter les noms trop longs" do
    long_name
= "a" * 51
    bad_guy
= User.new(@attr.merge(nom: long_name))
    bad_guy
.should_not be_valid
 
end

  it
"devrait accepter les adresses emails valides" do
    adresses
= %w[foo@bar.com FOO_BAR@baz.com foo.bar_baz@qux.fum.com]
    adresses
.each do |adress|
      valid_email
= User.new(@attr.merge(email: adress))
      valid_email
.should be_valid
   
end
 
end

  it
"devrait rejeter les adresses emails invalides" do
    adresses
= %w[foo@bar,com foo.bar.com foobar@baz.]
    adresses
.each do |adress|
      valid_email
= User.new(@attr.merge(email: adress))
      valid_email
.should_not be_valid
   
end
 
end

  it
"devrait rejeter les emails doubles" do
   
User.create!(@attr)
    user_duplicate
= User.create!(@attr)
    user_duplicate
.should_not be_valid
 
end

  it
"devrait rejeter les emails doubles insensible à la casse" do
    user_upcase
= @attr[:email].upcase
   
User.create!(@attr.merge(email: user_upcase))
    user
= User.create(@attr)
    user
.should_not be_valid
 
end
end


Je ne comprends pas car lors de l'exécution de rspec spec/ j'ai comme erreur :
Failed examples:

rspec
./spec/models/user_spec.rb:55 # User devrait rejeter les emails doubles
rspec
./spec/models/user_spec.rb:61 # User devrait rejeter les emails doubles insensible à la casse


Vous y comprenez quelque chose ? Merci de votre aide et désolé de parler français.

PS : Vous pouvez retrouver l'application en entier sur : https://github.com/mjerem34/sample_app/tree/users


Frederick Cheung

unread,
Mar 17, 2015, 3:50:15 PM3/17/15
to rubyonra...@googlegroups.com


On Tuesday, March 17, 2015 at 7:43:22 PM UTC, Jeremy Montesinos wrote:
Failed examples:

rspec
./spec/models/user_spec.rb:55 # User devrait rejeter les emails doubles
rspec
./spec/models/user_spec.rb:61 # User devrait rejeter les emails doubles insensible à la casse


Vous y comprenez quelque chose ? Merci de votre aide et désolé de parler français.


Quel est le message d'erreur? Si c'est une exception ActiveRecord::RecordInvalid c'est parce que le deuxième appel a User.create! va lever une exception, parce que l'utilisateur n'est pas unique. Pour pouvoir ensuire tested user.should_not be_valid, il faudrait plutôt utiliser User.create(@attr) (Sans le !)

Fred

Jeremy Montesinos

unread,
Mar 18, 2015, 3:13:08 AM3/18/15
to rubyonra...@googlegroups.com
Le message d'erreur c'est ça :
$ rspec spec/
................FF......

Failures:

 
1) User devrait rejeter les emails doubles
     
Failure/Error: user_duplicate.should_not be_valid
       expected
#<User id: 2, nom: nil, email: nil, created_at: "2015-03-18 07:08:44", updated_at: "2015-03-18 07:08:44"> not to be valid
     
# ./spec/models/user_spec.rb:58:in `block (2 levels) in <top (required)>'

 
2) User devrait rejeter les emails doubles insensible à la casse
     
Failure/Error: user.should_not be_valid
       expected
#<User id: 2, nom: nil, email: nil, created_at: "2015-03-18 07:08:44", updated_at: "2015-03-18 07:08:44"> not to be valid
     
# ./spec/models/user_spec.rb:65:in `block (2 levels) in <top (required)>'

Deprecation Warnings:

Using `should_not` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` with `config.expect_with(:rspec) { |c| c.syntax = :should }` instead. Called from /media/jeremy/5256-8C40/sample_app/spec/models/user_spec.rb:25:in `block (2 levels) in <top (required)>'.


If you need more of the backtrace for any of these deprecations to
identify
where to make the necessary changes, you can configure
`config.raise_errors_for_deprecations!`, and it will turn the
deprecation warnings
into errors, giving you the full backtrace.

1 deprecation warning total

Finished in 0.16859 seconds (files took 1.08 seconds to load)
24 examples, 2 failures

Failed examples:

rspec
./spec/models/user_spec.rb:55 # User devrait rejeter les emails doubles
rspec
./spec/models/user_spec.rb:61 # User devrait rejeter les emails doubles insensible à la casse


D'ailleurs j'ai un warning dont je ne connais pas la cause mais ça je verrais plus tard au pire. J'ai enlevé le ! du deuxième create, ça change rien, j'ai enlevé des deux create rien non plus et j'ai inversé les deux ça fait toujours rien donc je sais pas d'où ça viens...

Jeremy Montesinos

unread,
Mar 18, 2015, 3:53:06 AM3/18/15
to rubyonra...@googlegroups.com
J'ai du nouveau ! Apparement c'est le attr_accessor qui mettait la pagaille ! Merci à tous ! :)
Reply all
Reply to author
Forward
0 new messages