0

我想检查新人注册时使用的电子邮件地址是否与现有记录重复。

这是代码:

post '/signup' do
    email_address = params['email_address']
    username = params['username']
    password = params['password']
    @duplicate = DB[:users].select(:email_address).where('email_address = ?', email_address)
    if email_address = @duplicate
        redirect "/?msg=Email address already in use. Try again"
        return
    end
end

即使电子邮件地址不是重复的,这也会阻止所有尝试并使用错误消息进行重定向。

如果我@duplicateduplicate(不带@ 标记)替换,那么结果相同,所有尝试都会被阻止。如果我使用==而不是,=则忽略重复的电子邮件地址,并且不会阻止任何尝试。

我知道查询:

DB[:users].select(:email_address).where('email_address = ?', email_address)

是正确的,因为我已经测试过了。所以我认为问题在于 if 子句的构造。

4

2 回答 2

1

您需要在查询结束时添加 .first ,否则您将获得一个数组。

之后你可以测试@duplicate != nil

于 2013-05-13T10:33:46.033 回答
0

如果您email_address = @duplicate在其中编写代码,if则将始终执行,因为if表达式的条件始终为真。Ruby 中的任何内容,除了nil和在布尔上下文中false求值。true

如果您email_address == @duplicate在其中编写代码,if则将永远不会执行,因为您试图将字符串 ( email_address) 与类Sequel::Postgres::Dataset( @duplicate) 的对象进行比较。

更好的方法可能是

post '/signup' do
    # same code as yours...
    @duplicate = DB[:users].where(email_address: email_address).count
    unless @duplicate.zero?
      # redirect and return
    end
end
于 2013-05-13T11:46:45.163 回答