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