我有一个注册过程,有两个注册表单,取决于你是个人还是公司,都会被发布到同一个模型(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
任何帮助表示赞赏
答案 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