title: Rails Tutorial error: "Validation failed: Email has already been taken"
body: <p>I got as far as Listing 9.28. in Michael Hartl's Ruby on Rails Tutorial, and I am getting the following errors when running <code>bundle exec rspec spec/</code>. I am not sure how to clear these errors.</p>
  
  <pre><code>$ bundle exec rspec spec/
  ................................................FF...........FFFFFFFF
  
  Failures:
  
    1) User pages index profile page 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:27:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:29:in `block (4 levels) in &lt;top (required)&gt;'
  
    2) User pages index profile page 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:27:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:29:in `block (4 levels) in &lt;top (required)&gt;'
  
    3) User pages index edit page 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    4) User pages index edit page 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    5) User pages index edit page 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    6) User pages index edit with valid information 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    7) User pages index edit with valid information 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    8) User pages index edit with valid information 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    9) User pages index edit with valid information 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
    10) User pages index edit with valid information 
       Failure/Error: let(:user) { FactoryGirl.create(:user) }
       ActiveRecord::RecordInvalid:
         Validation failed: Email has already been taken
       # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in &lt;top (required)&gt;'
       # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in &lt;top (required)&gt;'
  
  Finished in 7.29 seconds
  69 examples, 10 failures
  
  Failed examples:
  
  rspec ./spec/requests/user_pages_spec.rb:31 # User pages index profile page 
  rspec ./spec/requests/user_pages_spec.rb:32 # User pages index profile page 
  rspec ./spec/requests/user_pages_spec.rb:102 # User pages index edit page 
  rspec ./spec/requests/user_pages_spec.rb:103 # User pages index edit page 
  rspec ./spec/requests/user_pages_spec.rb:104 # User pages index edit page 
  rspec ./spec/requests/user_pages_spec.rb:118 # User pages index edit with valid information 
  rspec ./spec/requests/user_pages_spec.rb:119 # User pages index edit with valid information 
  rspec ./spec/requests/user_pages_spec.rb:120 # User pages index edit with valid information 
  rspec ./spec/requests/user_pages_spec.rb:121 # User pages index edit with valid information 
  rspec ./spec/requests/user_pages_spec.rb:122 # User pages index edit with valid information
  </code></pre>
  
  <p>My user_pages_spec.rb:</p>
  
  <pre><code>require 'spec_helper'
  
  describe "User pages" do
  
    subject { page }
  
  
  describe "index" do
      before do
        sign_in FactoryGirl.create(:user)
        FactoryGirl.create(:user, name: "Bob", email: "bob@example.com")
        FactoryGirl.create(:user, name: "Ben", email: "ben@example.com")
        visit users_path
      end
  
      it { should have_selector('title', text: 'All users') }
  
  
      it "should list each user" do
        User.all.each do |user|
          page.should have_selector('li', text: user.name)
        end
  
  end
  
  describe "profile page" do
      let(:user) { FactoryGirl.create(:user) }
  
      before { visit user_path(user) }
  
      it { should have_selector('h1',    text: user.name) }
      it { should have_selector('title', text: user.name) }
  end
  
  
  describe "signup page" do
      before { visit signup_path }
  
      it { should have_selector('h1',    text: 'Sign up') }
      it { should have_selector('title', text: 'Sign up') }
    end
  
   describe "signup page" do
      before { visit signup_path }
  
      it { should have_selector('h1',    text: 'Sign up') }
      it { should have_selector('title', text: full_title('Sign up')) }
    end
  
  describe "signup" do
  
      before { visit signup_path }
  
      let(:submit) { "Create my account" }
  
      describe "with invalid information" do
        it "should not create a user" do
          expect { click_button submit }.not_to change(User, :count)
        end
  
        describe "error messages" do
          before { click_button submit }
  
          it { should have_selector('title', text: 'Sign up') }
          it { should have_content('error') }
        end
      end
  
      describe "with valid information" do
        before do
          fill_in "Name",         with: "Example User"
          fill_in "Email",        with: "user@example.com"
          fill_in "Password",     with: "foobar"
          fill_in "Confirmation", with: "foobar"
        end
  
        it "should create a user" do
          expect { click_button submit }.to change(User, :count).by(1)
        end
  
        describe "after saving the user" do
          before { click_button submit }
  
          let(:user) { User.find_by_email('user@example.com') }
  
          it { should have_selector('title', text: user.name) }
          it { should have_selector('div.alert.alert-success', text: 'Welcome') }
          it { should have_link('Sign out') }
  
        end
      end
    end
  
    describe "edit" do
      let(:user) { FactoryGirl.create(:user) }
      before do
        sign_in user
        visit edit_user_path(user)
      end
  
      describe "page" do
        it { should have_selector('h1',    text: "Update your profile") }
        it { should have_selector('title', text: "Edit user") }
        it { should have_link('change', href: 'http://gravatar.com/emails') }
      end
  
      describe "with valid information" do
        let(:new_name)  { "New Name" }
        let(:new_email) { "new@example.com" }
        before do
          fill_in "Name",             with: new_name
          fill_in "Email",            with: new_email
          fill_in "Password",         with: user.password
          fill_in "Confirm Password", with: user.password
          click_button "Save changes"
        end
  
        it { should have_selector('title', text: new_name) }
        it { should have_selector('div.alert.alert-success') }
        it { should have_link('Sign out', href: signout_path) }
        specify { user.reload.name.should  == new_name }
        specify { user.reload.email.should == new_email }
      end
      end
  
  
    end
  end
  </code></pre>
  
  <p>My spec/requests/authentication_pages_spec.rb Looks like this:</p>
  
  <pre><code>    require 'spec_helper'
  
  describe "Authentication" do
  
    subject { page }
  
    describe "signin page" do
      before { visit signin_path }
  
      it { should have_selector('h1',    text: 'Sign in') }
      it { should have_selector('title', text: 'Sign in') }
  
    end
  
    describe "signin" do
      before { visit signin_path }
  
      describe "with invalid information" do
      before { click_button "Sign in" }
  
      it { should have_selector('title', text: 'Sign in') }
      #it { should have_selector('div.flash.error', text: 'Invalid') }
  
        describe "after visiting another page" do
          before { click_link "Home" }
          it { should_not have_selector('div.flash.error') }
        end
      end
  
      describe "with valid information" do
        let(:user) { FactoryGirl.create(:user) }
        before { sign_in user }
  
        it { should have_selector('title', text: user.name) }
  
        it { should have_link('Users',    href: users_path) }
        it { should have_link('Profile', href: user_path(user)) }
        it { should have_link('Settings', href: edit_user_path(user)) }
        it { should have_link('Sign out', href: signout_path) }
        it { should_not have_link('Sign in', href: signin_path) }
  
        describe "followed by signout" do
          before { click_link "Sign out" }
          it { should have_link('Sign in') }
        end
      end
    end
  
    describe "authorization" do
  
      describe "for non-signed-in users" do
        let(:user) { Factory(:user) }
  
        describe "in the Users controller" do
  
          describe "visiting the edit page" do
            before { visit edit_user_path(user) }
            it { should have_selector('title', text: 'Sign in') }
          end
  
          describe "submitting to the update action" do
            before { put user_path(user) }
            specify { response.should redirect_to(signin_path) }
          end
  
          describe "visiting user index" do
            before { visit users_path }
            #it { should have_selector('title', text: 'Sign in') }
          end
  
        end
      end
  
      describe "as wrong user" do
        let(:user) { FactoryGirl.create(:user) }
        let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
        before { sign_in user }
  
        describe "visiting Users#edit page" do
          before { visit edit_user_path(wrong_user) }
          it { should_not have_selector('title', text: full_title('Edit user')) }
        end
  
        describe "submitting a PUT request to the Users#update action" do
          before { put user_path(wrong_user) }
          specify { response.should redirect_to(root_path) }
        end
      end
    end
  end
  </code></pre>
  
  <p>My users.controller.rb looks like this:</p>
  
  <pre><code>class UsersController &lt; ApplicationController
    before_filter :signed_in_user, only: [:edit, :update]
    before_filter :correct_user,   only: [:edit, :update]
  
    def index
      @users = User.all
    end
  
    def show
      @user = User.find(params[:id])
    end
  
    def new
      @user = User.new
    end
  
    def create
      @user = User.new(params[:user])
      if @user.save
        sign_in @user
          flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
      else
        render 'new'
      end
    end
  
    def edit
      @user = User.find(params[:id])
    end
  
    def update
      @user = User.find(params[:id])
      if @user.update_attributes(params[:user])
        flash[:success] = "Profile updated"
        sign_in @user
        redirect_to @user
      else
        render 'edit'
      end
    end
  
    private
  
      def signed_in_user
        redirect_to signin_url, notice: "Please sign in." unless signed_in?
      end
  
      def correct_user
        @user = User.find(params[:id])
        redirect_to(root_path) unless current_user?(@user)
      end
  
  end
  </code></pre>
  
  <p>sessions.helper.rb:</p>
  
  <pre><code>module SessionsHelper
  
    def sign_in(user)
      cookies.permanent[:remember_token] = user.remember_token
      self.current_user = user
    end
  
    def signed_in?
      !current_user.nil?
    end
  
    def current_user=(user)
      @current_user = user
    end
  
    def current_user
      @current_user ||= User.find_by_remember_token(cookies[:remember_token])
    end
  
    def current_user?(user)
      user == current_user
    end
  
    def signed_in_user
      unless signed_in?
        store_location
        redirect_to signin_url, notice: "Please sign in."
      end
    end
  
    def sign_out
      current_user = nil
      cookies.delete(:remember_token)
    end
  
    def redirect_back_or(default)
      redirect_to(session[:return_to] || default)
      session.delete(:return_to)
    end
  
    def store_location
      session[:return_to] = request.url
    end
    end
  </code></pre>
  
  <p>header.html.erb:</p>
  
  <pre><code>&lt;header class="navbar navbar-fixed-top"&gt;
    &lt;div class="navbar-inner"&gt;
      &lt;div class="container"&gt;
        &lt;%= link_to "sample app", root_path, id: "logo" %&gt;
        &lt;nav&gt;
          &lt;ul class="nav pull-right"&gt;
            &lt;li&gt;&lt;%= link_to "Home", root_path %&gt;&lt;/li&gt;
            &lt;li&gt;&lt;%= link_to "Help", help_path %&gt;&lt;/li&gt;
            &lt;% if signed_in? %&gt;
              &lt;li&gt;&lt;%= link_to "Users", users_path %&gt;&lt;/li&gt;
              &lt;li id="fat-menu" class="dropdown"&gt;
                &lt;a href="#" class="dropdown-toggle" data-toggle="dropdown"&gt;
                  Account &lt;b class="caret"&gt;&lt;/b&gt;
                &lt;/a&gt;
                &lt;ul class="dropdown-menu"&gt;
                  &lt;li&gt;&lt;%= link_to "Profile", current_user %&gt;&lt;/li&gt;
                  &lt;li&gt;&lt;%= link_to "Settings", edit_user_path(current_user) %&gt;&lt;/li&gt;
                  &lt;li class="divider"&gt;&lt;/li&gt;
                  &lt;li&gt;
                    &lt;%= link_to "Sign out", signout_path, method: "delete" %&gt;
                  &lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;% else %&gt;
              &lt;li&gt;&lt;%= link_to "Sign in", signin_path %&gt;&lt;/li&gt;
            &lt;% end %&gt;
          &lt;/ul&gt;
        &lt;/nav&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/header&gt;
  </code></pre>