Ruby on Rails,查找列中是否存在某个值

时间:2014-03-04 12:41:22

标签: ruby-on-rails

我正在使用用户身份验证构建网站。我只是注意到,如果我创建一个具有现有电子邮件的用户,它就不起作用,这是正常的,但我想向用户提供反馈。因此,我需要确定是否有任何用户已经拥有该电子邮件。 我尝试了一些类似的事情:

if User.email.include? params[:user][:email]
    flash.now[:error] = "A user with this password already exists"
    render :action => :new, :layout => 'signin-layout.html.erb'

这些是User的列:

2.1.0 :014 > User.column_names
=> ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin", "team_id", "teamLeader"]

我得到的结果是一个很大的错误:

undefined method `email' for #<Class:0x00000102b9a908>

因此,如果有人看到我做错了什么,或者知道另一种方法,那就太好了。

干杯

2 个答案:

答案 0 :(得分:6)

试试这个:

if User.exists?(:email => params[:user][:email])
    flash.now[:error] = "A user with this password already exists"
    render :action => :new, :layout => 'signin-layout.html.erb'
    ...
else 
  # more code here..
end

此外,您可以在创建对象时添加验证:

class User
  validates_uniqueness_of :email

有关此处不同验证的更多信息:http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html

答案 1 :(得分:2)

我相信这种验证方式是错误的,你应该验证用户模型本身的电子邮件的唯一性,如下所示

validates :email, uniqueness: true #User model

这样验证将在用户模型上进行。您正在使用的条件的问题是它正在访问特定于对象的实例方法作为类方法。所以User.email意味着有一个名为email的方法,它对于用户类的所有实例具有相同的逻辑,或者更正式地是一个你没有的类方法。电子邮件是特定于每个用户的属性的实例属性/变量(每个用户都有不同的电子邮件)。

您可以使用@ user.errors.full_messages查看/显示模型上存在的验证错误,其中@user是您尝试注册/保存的实例。

如果此操作用于注册用户,即创建新用户,我通常会这样做。

class User < ActiveRecord::Base
    #attribute accessors and accessible
    validates :email, uniqueness: true     
end
class UsersController < ApplicationController
    def create
        @user = User.new params[:user]
        if @user.save
            #code for redirect or rendering the page you want
        else
            render 'new'
        end
    end
end
#new.html.erb
<%= form_for @user do |f| %>
  <% if @user.errors.any? %>
    <div>
      <ul>
         <% @job.errors.full_messages.each do |msg| %>
           <li><%= msg %></li>
         <% end %>
      </ul>
    </div>
  <% end %>
  #form fields
<% end %>

这样您就可以在注册表单的顶部向用户显示所有错误消息。