两种形式的验证

时间:2014-09-05 12:11:03

标签: ruby-on-rails validation activerecord ruby-on-rails-4 devise

我有一个注册过程,有两个注册表单,取决于你是个人还是公司,都会被发布到同一个模型(User with devise)。我正在模型中设置我的验证,但是想知道如何为每个表单上不同的输入字段设置验证。

例如:company_no仅在公司注册表单上,但如果我为此字段添加验证,则单个注册表单将失败并在:company_no字段上抛出错误

我已设置这些链接以将用户带到正确的表单

<p><%= link_to 'Sign Up as Individual', new_user_registration_path %></p>
<p><%= link_to 'Sign Up as Vets/Rescue Centre', new_user_registration_path(organization: true) %></p>

查看

<% if params[:organization] %>
 <%= render 'shared/company_signup_form' %>
<% else %>
 <%= render 'shared/individual_signup_form' %>
<% end %>

我尝试使用的简单验证示例

class User < ActiveRecord::Base
  validates :company_no, presence: true
end

任何帮助表示赞赏

2 个答案:

答案 0 :(得分:2)

有多种解决方案。

一个微不足道的是使用条件验证,但这会变得混乱。

IMO最干净的是使用非持久模型,每个模板一个,并从中创建用户模型。

这将持久化(域)模型与表单表示隔离开来。由于Rails提倡在模型上进行验证,而没有简单的方法来分离上下文,因此创建表单模型有时比尝试条件化所有内容要少得多。当它超过一两个条件时尤其如此。

答案 1 :(得分:1)

你可以做的是使用rails conditional validation并执行以下操作:

class User< ActiveRecord::Base
  validates :company_no, presence: true, if: :record_is_company?

  def record_is_company?
    # check for some field which distinguish between a user and company
  end
end

<强>更新

正如 @Dave 指出如果要检查多个验证,那么您可以制作非持久模型,或者不使用rails验证方法,而是可以two custom validation methods和然后利用validation errors添加错误,因此您的用户模型将是这样的:

class User< ActiveRecord::Base
  validate :company_account, if: :record_is_company?
  validate :user_account, if: :record_is_user?

  def company_account
    # validate company form fields and add error
  end

  def user_account
    # validate user form fields and add error
  end

  def record_is_company?
    # check for some field which distinguish between a user and company
  end

  def record_is_user?
    # check for some field which distinguish between a user and company
  end
end

<强>更新 我没有检查数据库字段的条件。如果我们使用虚拟属性并将其设置为表单(如您在评论中所建议的那样),那将会更好。

attr_accessor :company_form
validates :company_name, presence: true, if: :record_is_company? 

def record_is_company?
  true if company_form 
end