我正在开发一个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
我有一些逻辑可用,但我不知道如何将验证器专门连接到此表单。
由于AfterSignUpValidator
是User
模型的一部分,但它本身不是模型..我真的不知道它应该从哪里继承。
感谢任何指导〜!
答案 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)
...
docs或blog article中的详细信息。