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

问题描述 投票:0回答:4

我是 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
ruby-on-rails ruby ruby-on-rails-5
4个回答
5
投票

它确实有效,因为用户的电子邮件地址未正确传递。这可以通过将

@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 }

并将您的

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
投票

在模型文件中像这样使用

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

1
投票

按照建议,您应该对此类事情使用模型验证。但是,这就是您的代码不起作用的原因。

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

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

以上来自 存在吗?文档


0
投票

正如上面几乎人们建议的那样,这是使用唯一性验证的最佳方法。

但是,如果你想尝试一下存在吗? 你可以这样做,

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

© www.soinside.com 2019 - 2024. All rights reserved.