“存在吗?”方法不起作用-在保存到数据库之前尝试检查用户是否存在

时间:2019-01-02 16:52:19

标签: ruby-on-rails ruby ruby-on-rails-5

我是Rails的新手,正在尝试为我的网站创建一个注册表单。它工作正常,但有一个例外-将用户保存到数据库中,而无需先检查用户是否存在。在保存之前,我该如何检查以确保用户存在?

用户控制器:

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

4 个答案:

答案 0 :(得分:4)

一个非常简单的验证就是这样:

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

您可能要忽略大小写:

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

然后将您的create方法更改为以下内容:

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

答案 1 :(得分:1)

像这样在模型文件中使用

validates_uniqueness_of :username #=> or specify :email or :name etc...

答案 2 :(得分:0)

如建议的那样,您应该对此类使用模型验证。但是,这就是您的代码无法正常工作的原因。

exists?方法将用于模型类,而不是其实例,例如:

Person.exists?(5)
Person.exists?(:name => "David")

以上内容来自exists? docs

答案 3 :(得分:0)

正如上面的几乎所有人所建议的那样,这是使用uniqueness验证的最佳方法。

但是,如果您想尝试使用exists? 你可以喜欢,

  

User.exists?(用户名:params [:username])