【问题标题】:Validate Attribute without saving验证属性而不保存
【发布时间】:2013-01-27 19:52:13
【问题描述】:

在 Rails 3 中,我想查看属性的值是否使用模型的 validates 选项有效,而无需尝试保存或创建。

我正在编写 AJAX API 的后端,它应该检查用户名与

validates :username, :length => {:minimum => 2, :maximum => 50}, :exclusion => {:in => RESERVED_USERNAMES}, :format => MY_REGEX, .etc

在用户模型中。这是在注册表单中的用户名字段旁边创建一个小勾号或交叉,因此用户不必等待查看用户名是否被使用。

我可以将它与正则表达式进行比较,但为了尽量保持我的代码 DRY,我认为在用户模型中使用验证会更好。

任何人都知道我该怎么做:

username = params[:username]

if User.not_found(:username => username) && User.validate(:username => username)
    #yay!
else
    #nope
end

(我已经让not_found 工作了)。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 validation


    【解决方案1】:

    除了运行所有验证之外,您还可以尝试检查与用户名相关的特定错误(您需要这样做才能获得错误消息)。

    @user = User.new(params[:user])
    if @user.invalid? && @user.errors[:username].any?
      # yay!
    else
      # nope
    end
    

    您可以在不将用户持久保存到数据库的情况下运行它,因为所使用的方法(包括 #new 和 #valid?)都没有实际保存对象。

    【讨论】:

    • 这要求我创建一个包含所有其他属性(如电子邮件、密码等)的用户对象,否则每次都会返回 false,因为其他属性验证将失败,对吧?
    • 我会为“and”和@user.errors.include 更改&&? @user.errors[:username].any?
    • 你可以用@user.invalid?代替@user.valid? == false
    • 谢谢,@Koen。编辑了答案以包含您的建议。
    【解决方案2】:

    您可以使用用户名参数创建新用户,然后检查错误:

    @user = User.new( :username => params[:username] )
    @user.valid?    
    
    if @user.errors.include? :username
      # username error
    end
    

    【讨论】:

    • 你需要调用valid吗?首先触发验证,最好检查@user.errors[:username].any?而是
    • 抱歉,需要调用valid吗?
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多