2015-08-25 89 views
0

我花了好几天的时间寻找这个,我在创建用户时创建了一个用户名表,并且在项目后期意识到我不需要拥有这些用户表,而只是让他们使用电子邮件。我尝试过不同的事情,但没有运气。请注意:我不使用DEVISE。我也不想使用Devise。这里是我的代码,感谢先进的如果你能帮助我!不,这不是与另一个问题不一样的问题,因为我读了这个问题,并且做了正确的答案并且没有运气。如何让用户使用他们的电子邮件或用户名登录?

这是users_controller.rb,

class UsersController < ApplicationController 
    before_action :set_user, only: [:show, :edit, :update, :destroy] 
    after_action :signed_in_after_register, only: :create 

    def index 
    @users = User.all 
    @user = User.find(session[:user_id]) 
    @user = User.search(params[:search]) 
    end 

    def dashboard 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3) 
    @comment = Comment.new 
    @post = Post.new 
    end 

    def newsfeed 
    @user = User.find(session[:user_id]) unless session[:user_id] == nil 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3) 
    end 

    def nav 
    @user = User.find(session[:user_id]) 
    end 
    def posts 
    @user = User.find(session[:user_id]) 
    @posts = @user.posts 
    end 

    def destroy 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    end 

    def welcome 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    end 

    def show 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3) 
    @comment = Comment.new 
    @post = Post.new 
    end 

    def new 
    @post = Post.new(params[:post_id]) 
    @user = User.new 
    end 

    def edit 

    end 

    def create 
    @user = User.new(user_params) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to dashboard_path, notice: 'User was successfully created!' } 
     format.json { render :show, status: :created, location: @user } 
     else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 

    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to dashboard_path, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @user.destroy 
    respond_to do |format| 
     format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_user 
     @user = User.find(params[:id]) 
    end 
    def signed_in_after_register 
     session[:user_id] = @user.id 
    end 

    def user_params 
     params.require(:user).permit(:first_name, :last_name, :name, :bio, :password, :password_confirmation, :email, :age, :profile_picture, :post, :body) 
    end 
end 

这里是我的user.rb型号,

class User < ActiveRecord::Base 
    has_secure_password 
    validates :email, :first_name, :last_name, :name, presence: true, uniqueness: true 
    validates_inclusion_of :age, in: 10..100 
    validates :password, presence: true 
    has_many :posts 
    has_attached_file :profile_picture, :styles => { :medium => "300x300>", :thumb => "100x100>" }, 
    :default_url => "app/assets/images/missing.png", 
    :path => ":rails_root/public/system/:class/:attachment/:id_partition/:style/:filename" 
    validates_attachment_content_type :profile_picture, :content_type => /\Aimage\/.*\Z/ 

end 

这是我_form.html.erb,

<%= form_for @user, html: { multipart: true } do |f| %> 
    <% if @user.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2> 

     <ul> 
     <% @user.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
<div class="sign_up_form_2"> 
    <div class="field"> 
    <%= f.label :first_name %> 
    <%= f.text_field :first_name, placeholder: "First Name", class: "form-control" %> 
    </div> 
    <div class="field"> 
    <%= f.label :last_name %> 
    <%= f.text_field :last_name, placeholder: "Last Name", class: "form-control" %> 
    </div> 
    <div class="field"> 
    <%= f.label :email %><br> 
    <%= f.text_field :email, placeholder: "Email", class: "form-control" %> 
    </div> 
    <div class="field"> 
    <%= f.label :age %><br> 
    <%= f.number_field :age, placeholder: "Age", class: "form-control" %> 
    </div> 
    <div class="field"> 
    <%= f.label :password %><br> 
    <%= f.password_field :password, placeholder: "Password", class: "form-control" %> 
    </div> 
    <div class="field"> 
    <%= f.label :password_confirmation %><br> 
    <%= f.password_field :password_confirmation, placeholder: "Password Confirmation", class: "form-control" %> 
    </div><br> 
    <div class="field"> 
    <%= f.label :bio %> 
    <%= f.text_area :bio, placeholder: "Write something!", class: "form-control" %> 
    </div> 
    <div class="field"> 
    <%= f.label :profile_picture %> 
    <%= f.file_field :profile_picture %><br> 
    </div> 
    <div class="actions"> 
    <%= f.submit "Create Account", class: "btn btn-default btn-sign-up" %> 
    </div> 

<% end %> 
</div> 

这在我sessions_controller.rb中,

class SessionsController < ApplicationController 
    before_action :checked_logged_in, only: :login 
    def login 

    end 

    def create 
    user = User.find_by(name: params[:name]) 
    if user and user.authenticate(params[:password]) 
     session[:user_id] = user.id 
     redirect_to dashboard_path 
    else 
     redirect_to login_url, notice: "Invalid User or Password Combination" 
    end 

    end 

    def destroy 
    if session[:user_id] 
     session[:user_id] = nil 
     redirect_to login_url 

    end 

    end 
    private 

    def checked_logged_in 
    if session[:user_id] 
     redirect_to dashboard_path, notice: "You are already logged in" 

    end 

    end 
end 

以防万一,这里是我的Gemfile,

source 'https://rubygems.org' 

gem 'rails', '4.2.0' 

gem 'sqlite3' 

gem 'sass-rails', '~> 5.0' 

gem 'uglifier', '>= 1.3.0' 

gem 'coffee-rails', '~> 4.1.0' 

gem 'bcrypt-ruby' 

gem "twitter-bootstrap-rails" 

gem "paperclip", "~> 4.2" 

gem 'jquery-rails' 

gem 'turbolinks' 

gem 'jbuilder', '~> 2.0' 

gem 'sdoc', '~> 0.4.0', group: :doc 

gem 'imagemagick-identify', '~> 0.0.1' 

gem 'bootstrap-sass', '~> 3.3.3' 

group :development, :test do 

    gem 'byebug' 

    gem 'web-console', '~> 2.0' 
end 

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 

我愿意,如果需要任何进一步解释,我也很愿意发布任何代码,你可能需要查看帮助我!感谢您的时间!

+0

您可能需要查看[rails基本认证指南](http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html) –

+0

可能的重复[如何允许用户使用用户\ _name或电子邮件使用Rails](http://stackoverflow.com/questions/31929897/how-to-allow-a-user-to-login-with-user-name-or-email-using-rails) – Sculper

+0

我读过那台Sculper,但在我的最后没有运气,所以我想我会问自己。 :) – genobambino

回答

1

在SessionsController#创建改变这一行:

user = User.find_by(name: params[:name]) 

这样:

user = User.find_by(name: params[:name]) || 
     User.find_by(email: params[:name]) 

或者一些其他的变种,着眼于两个领域:

user = User.where(["name = ? OR email = ?", params[:name], params[:name]]).first 

你也可以查看params[:name],如果它里面有'@',请用电子邮件查看,否则用户名称。

+0

谢谢这么多人!我会评价你的答案是正确的!这意味着很多,你给我尝试的第三行代码虽然不起作用,但另外两行代码是user = User.find_by(name:params [:name])|| User.find_by(email:params [:name])谢谢! – genobambino

+0

@genobambino刚刚注意到第三行中缺少']'。它现在应该可以工作。 –

+0

谢谢你!那意义重大! – genobambino

相关问题