将电子邮件存储为大写的任何问题?

时间:2017-02-16 06:36:30

标签: ruby-on-rails

我不时会注意到用户的电子邮件是重复的。即使使用模型验证(应用程序级别)来检查唯一性。我怀疑这与并发问题有关。

我决定在数据库级别添加一个索引来解决这个问题。

无论如何,较低的指数可能是明智的。

即使我们保证在应用程序级别降低电子邮件。数据库提供了更强的一致性保证。

这可能永远不会有问题,但让数据库执行它也不会有害。

我可以提供许多额外的保护措施,以最大限度地提高从应用程序端输入大写字符的几率,但应用程序仍然无法控制从其他来源进入数据库的数据,并且所有代码都是容易出现开发人员错误,维护成本等。

class CreateUniqueIndexForUserEmails < ActiveRecord::Migration
  def up
    remove_index :users, :email

    execute <<-SQL
      CREATE UNIQUE INDEX index_users_on_lower_email ON users (LOWER(email));
    SQL
  end

  def down
    execute <<-SQL
      DROP INDEX index_users_on_lower_email;
    SQL

    add_index :users, :email
  end
end

我还将此逻辑与user模型中的此代码块相结合:

def email=(value)
  write_attribute :email, value.downcase
end

确保FooBar@email.com重写为foobar@email.com(在应用级别)。

我在线阅读了RFC,主要来自Are email addresses case sensitive?的指针,表明某些电子邮件服务器关注区分大小写。

即便如此,我今天发送电子邮件时也是如此。我几乎不把心思放进肠衣里。事实上,我输入的电子邮件是羽绒服。电子邮件仍然可以发送。

RFC是否值得高度重视?即如果用户输入FooBar@email.com,app会将电子邮件注册为foobar@email.com。这会对电子邮件“可传递性”产生任何影响吗?

如果没有,我应该考虑哪些其他问题?

1 个答案:

答案 0 :(得分:1)

Devise在电子邮件属性上应用了downcase,所以我认为这不是问题。

请参阅:https://github.com/plataformatec/devise/blob/f7b6d786066cef2f5e8d2ce9c6b6cc83918580eb/test/models/database_authenticatable_test.rb#L17

请参阅Devise测试文件中的其他断言以了解要进行的转换。