Home > Software design >  Ruby Rails User's Email Being overwritten
Ruby Rails User's Email Being overwritten

Time:02-10

Playing around with authentication from scratch and for some reason my users email address is not being saved to the DB. When I fire up the console and pull a random user, their email is always nil, but have validations set for the presence of email and am get a successful user created message. This was working before and not sure what broke it. I know this is something super simple but it has got me for the last few hours and am hoping a second pair of eyes can tell me what I'm doing wrong. GitHub link below [https://github.com/smarandache1990/auth][1]

        <h1>Sign Up</h1>

        <%= form_for @user do |f| %>
          <% if @user.errors.any? %>
            <div >
              <h2>Form is invalid</h2>
              <ul>
                <% for message in @user.errors.full_messages %>
                  <li><%= message %></li>
                <% end %>
              </ul>
            </div>
          <% end %>
          <p>
            <%= f.label :email %><br />
            <%= f.text_field :email %>
            <% @user.errors.full_messages_for(:email).each do |message| %>
              <div><%= message %></div>
            <% end %>
          </p>
          <p>
            <%= f.label :password %><br />
            <%= f.password_field :password %>
            <% @user.errors.full_messages_for(:password).each do |message| %>
              <div><%= message %></div>
            <% end %>
          </p>
          <p>
            <%= f.label :password_confirmation %><br />
            <%= f.password_field :password_confirmation %>
            <% @user.errors.full_messages_for(:password_confirmation).each do |message| %>
              <div><%= message %></div>
            <% end %>
          </p>
          <p ><%= f.submit %></p>
        <% end %>
        <h1>Sign In</h1>

        <%= form_tag sessions_path do %>

            <p>
                <%= label_tag :email %><br />
                <%= text_field_tag :email, params[:email] %>
            </p>
            <p>
                <%= label_tag :password %><br />
                <%= password_field_tag :password %>
            </p>
            <p ><%= submit_tag "Log in" %></p>

        <% end %>
            class User < ApplicationRecord
                attr_accessor :email, :password, :password_confirmation

                before_save :encrypt_password
                
                validates :password, confirmation: true, on: :create 
                validates :password_confirmation, presence: true
                
                #validates_presence_of :password, :on => :create
                #validates_confirmation_of :password
                validates_presence_of :email
                validates_uniqueness_of :email
                
                def self.authenticate(email, password)
                user = find_by_email(email)
                if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
                    user
                else
                    nil
                end
                end
                
                def encrypt_password
                if password.present?
                    self.password_salt = BCrypt::Engine.generate_salt
                    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
                end
                end
            end

    class UsersController < ApplicationController
      def new
        @user = User.new
      end
      
      def create
        @user = User.new(user_params)
        if @user.save
          redirect_to log_in_path, :notice => "Signed up!"
        else
          render :new, status: :unprocessable_entity
        end
      end

      private
      def user_params
        params.require(:user).permit(:email, :password, :password_confirmation)
      end
    end
        class SessionsController < ApplicationController
          def new
          end
          
          def create
            @user = User.authenticate(params[:email], params[:password])
            if @user
              session[:user_id] = @user.id
              redirect_to root_url, :notice => "Logged in!"
            else
              flash.now[:notice] = "Wrong username or password"
              render :new, status: :unprocessable_entity
            end
          end
          
          def destroy
            session[:user_id] = nil
            redirect_to root_url, :notice => "Logged out!"
          end
          
        end

CodePudding user response:

Remove the email from the attr_acessor (here).

attr_accessor creates the getters and setters for all attributes listed there. So, basically, you're overriding these methods for the email attribute.

About the validation, use this:

validates :email, presence: true, uniqueness: true
  • Related