Techioz Blog

存在する?メソッドが機能しません - DB に保存する前にユーザーが存在するかどうかを確認しようとしています

概要

私は Rails を初めて使用するので、自分のサイトのサインアップ フォームを作成しようとしています。これは 1 つの例外を除いて正常に動作します。ユーザーが存在するかどうかを最初に確認せずにデータベースに保存します。ユーザーを保存する前に、ユーザーが存在することを確認するにはどうすればよいですか?

ユーザーコントローラー:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create 
    @user = User.new(user_params)
    if @user.exists?(:username) == false && @user.save(user_params)
      session[:id] = @user.id
      redirect_to posts_path
    else
      redirect_to '/signup'
    end
  end

  def edit

  end

  def update
  end

  def show
  end

  def destroy
  end

    private

  def user_params
    params.require(:user).permit(:username, :jabber_id, :password)
  end
end

解決策

ユーザーの電子メール アドレスが適切に渡されないため、これは機能します。この問題は、@user.exists?(:username) を @user.exists?(params[:username]) に変更することで修正できます。

ただし、Ruby on Rails にはそのような検証が含まれているため、独自に検証を記述する必要はありません。 Rails の存在と一意性の検証を次のように使用します。

# in your user.rb
validates :username, presence: true, uniqueness: true

大文字と小文字を無視することもできます。

# in your user.rb
validates :username, presence: true, uniqueness: { case_sensitive: false }

そして、作成メソッドを次のように変更します。

def create 
  @user = User.new(user_params)

  if @user.save 
    session[:id] = @user.id
    redirect_to posts_path
  else
    render :new
  end
end

さらに、データベース レベルでも一意のインデックスを持つことをお勧めします。

# in a migration
add_index :users, :username, unique: true