2015-08-25 1 views
0

Я потратил дни, ища это, я создал таблицу имени пользователя при создании своих пользователей и понял позже в проекте, что мне не нужно было это, но вместо этого просто позволю им использовать электронное письмо. Я пробовал разные вещи, не повезло. ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Я НЕ ИСПОЛЬЗУЮТ УСТРОЙСТВО. Я тоже не хочу использовать 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> 

Это находится в моих заседаниях_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

Возможно, вы захотите ознакомиться с [справочным руководством по основным рельсам] (http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html) –

+0

Возможный дубликат [Как разрешить пользователю входить в систему с помощью user \ _name или email, используя Rails] (http://stackoverflow.com/questions/31929897/how-to-allow-a-user-to-login-with-user-name-or-email-using-rails) – Sculper

+0

Я прочитал этот один Скальпер, но мне не повезло, поэтому я решил, что спрошу себя. :) – 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

Спасибо большое! Я буду оценивать ваш ответ как правильно! Это много значит, 3-я строка кода, которую вы мне предложили, не работает, хотя остальные два сделали user = User.find_by (name: params [: name]) || User.find_by (электронная почта: params [: name]), так что спасибо! – genobambino

+0

@genobambino Просто заметил недостающую ']' в этой третьей строке. Он должен работать и сейчас. –

+0

Спасибо, человек! Это значит многое! – genobambino

Смежные вопросы

 Смежные вопросы