Rails uniqueness email


#1

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: “removed_email_address@domain.invalid”}
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[removed_email_address@domain.invalid removed_email_address@domain.invalid removed_email_address@domain.invalid]
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


#2

On Tuesday, March 17, 2015 at 7:43:22 PM UTC, Jeremy M. wrote:

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


#3

J’ai du nouveau ! Apparement c’est le attr_accessor qui mettait la
pagaille ! Merci à tous ! :slight_smile:


#4

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)>’

  1. 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…