Forum: Ruby on Rails Rails uniqueness email

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
E38c3a5dbd2887f4290b8bb777be88f8?d=identicon&s=25 Jeremy Montesinos (Guest)
on 2015-03-17 20:44
(Received via mailing list)
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: "user@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
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2015-03-17 20:51
(Received via mailing list)
On Tuesday, March 17, 2015 at 7:43:22 PM UTC, Jeremy Montesinos 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
E38c3a5dbd2887f4290b8bb777be88f8?d=identicon&s=25 Jeremy Montesinos (Guest)
on 2015-03-18 08:14
(Received via mailing list)
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...
E38c3a5dbd2887f4290b8bb777be88f8?d=identicon&s=25 Jeremy Montesinos (Guest)
on 2015-03-18 08:54
(Received via mailing list)
J'ai du nouveau ! Apparement c'est le *attr_accessor* qui mettait la
pagaille ! Merci à tous ! :)
This topic is locked and can not be replied to.