特定于一个表单的Rails验证

时间:2015-05-25 20:07:07

标签: ruby-on-rails validation

我正在开发一个Web应用程序,用户有一个两步注册过程。在第一步之后,已经创建了User对象。第二步,用户将填写更多信息。因此,我想知道如何创建表单特定的验证。我在这里复制了我的相关代码。

控制器 after_sign_up_controller.rb:

class Users::AfterSignupController < ApplicationController
    before_action :authenticate_user!
    # after_save :user_signup_completed!    

    def finish
        verify_referral_code params[:referer_referral_code]

        respond_to do |format|
            format.html { render }
            format.json { render :json => { errors: resource.errors }, :status => :unprocessable_entity }
        end
    end

    protected

    def form_params
        params.permit(
            :referer_referral_code,
            :primary_email,
            :mobile_number,
            :nickname,
            :date_of_birth
        )
    end

end

我正在考虑使用验证器验证此形式的参数。但我不太清楚该怎么做。

我创建了app/validators/after_sign_up_validator.rb

class AfterSignUpValidator < ActiveRecord::Base
    include ActiveModel::Validations

    attr_accessor :referer_referral_code, :primary_email, :date_of_birth, :mobile_number, :nickname

    validate :referer_referral_code, :validates_referral_code
    validate :mobile_number, presence: true, numericality: {only_integer: true}
    validate :primary_email, :validates_email
    validates_presence_of :date_of_birth
    validates_presence_of :nickname

    def validates_email email
        if current_user.email == email
            return true
        end
        if User.where(email: email).nil?
            errors.add(:email, 'Email already exists')
        end
    end

    def validates_referral_code refcode
        if refcode != ""
            u = User.where(referral_code: refcode).first
            if u.nil?
                errors.add(:referer_referral_code, 'No such referral code')
            end

            if !u.nil? && u.id
                return u.id
            end
        end
    end

end

我有一些逻辑可用,但我不知道如何将验证器专门连接到此表单。

由于AfterSignUpValidatorUser模型的一部分,但它本身不是模型..我真的不知道它应该从哪里继承。

感谢任何指导〜!

2 个答案:

答案 0 :(得分:3)

在这些类型的情况下,常见的方法是将此功能提取到表单对象中。 This blog post在使用Virtus gem的表单对象上有一个很好的概述,效果非常好。

虽然我还没有机会使用它,但Reform看起来也很有希望。

最后,如果你有一个Railscasts Pro帐户(强烈推荐),Ryan在form objects上做了很好的一集。

希望这有帮助。

答案 1 :(得分:0)

有时,对于简单的用例,您可以定义上下文验证。

看起来像:

# in model
validates :referal_code, on: :signup.
validates :email, on: :update.

# in controller 
@user = User.new(user_params)
if user.save(:signup)
...

docsblog article中的详细信息。