📜  rails 验证唯一性 - Ruby (1)

📅  最后修改于: 2023-12-03 15:19:42.244000             🧑  作者: Mango

Rails 验证唯一性

在 Rails 中,我们常常需要验证某些属性的唯一性,例如用户名、电子邮件等。这种验证可以确保我们的数据是唯一的,避免出现重复的数据。

在模型中验证唯一性

在 Rails 中,我们可以使用 validates_uniqueness_of 方法来验证模型的属性是否唯一。例如,如果我们想验证用户的电子邮件地址必须唯一,可以在用户模型中添加以下代码:

class User < ApplicationRecord
  validates :email, uniqueness: true
end

这个代码片段使用 validates 方法来定义模型验证。我们将属性名称 email 作为参数传递给 validates 方法。使用 uniqueness: true 选项,我们可以告诉 Rails 验证电子邮件地址必须是唯一的。

但是,默认情况下,Rails 只会检查数据库中已存在的记录是否与当前记录重复。如果我们想同时检查未保存的记录,可以使用 scope 选项:

class User < ApplicationRecord
  validates :email, uniqueness: { scope: :name }
end

这个代码片段使用了 scope 选项,将另一个属性 name 作为条件传递给 uniqueness。这样,我们就可以同时确保电子邮件地址和名字的组合是唯一的。

最后,我们需要确保在数据库中设置了正确的唯一性约束。可以使用 add_index 方法来创建唯一性索引:

class AddIndexToUsersEmail < ActiveRecord::Migration[6.0]
  def change
    add_index :users, :email, unique: true
  end
end

这个代码片段将使用 add_index 方法来创建一个名为 index_users_on_email 的索引,以确保电子邮件地址是唯一的。

在表单中验证唯一性

除了在模型中验证唯一性外,我们还可以在表单中验证唯一性。这可以确保用户在提交表单时输入的数据是唯一的。

首先,我们需要在控制器中定义一个实例变量来初始化表单:

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

然后,在表单视图中我们可以使用 text_field 辅助方法生成一个文本输入框。我们还可以使用 form_with 辅助方法定义表单:

<%= form_with url: users_path do |f| %>
  <%= f.label :email %>
  <%= f.text_field :email %>

  <%= f.submit %>
<% end %>

最后,在模型中我们需要使用 validates 方法来验证表单数据的唯一性:

class User < ApplicationRecord
  validates :email, uniqueness: true
end

这个代码片段与之前的模型代码片段类似,但是将在表单中使用而不是在数据库中使用。

总结

在 Rails 中验证唯一性非常容易。我们可以使用 validates_uniqueness_of 方法在模型中验证唯一性,使用 add_index 方法创建唯一性索引。我们还可以在表单中使用 validates 方法验证数据的唯一性,确保用户输入的数据是唯一的。