存在する?メソッドが機能しません - 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