1

我有一个注册过程,有两个注册表单,这取决于您是个人还是公司,都发布到同一模型(用户与设计)。我正在模型中设置我的验证,但想知道如何设置每个表单上不同的输入字段的验证。验证两种形式

例如: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 

任何帮助赞赏

回答

1

你可以做的是利用轨道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 

更新:

由于@戴夫指出如果有多个验证要检查,那么要么你可以让non-persi的受激发射损耗模型或不使用轨道验证方法可以使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  
+1

谢谢你,所以如果我有一个隐藏字段company_form,value :: true,在record_is_company?方法,我只是把company_form? – Richlewis 2014-09-05 13:04:31

+0

@Richlewis是的,应该这样做,但不是添加一个额外的隐藏字段,你也可以检查字段是不同的用户和公司。我不知道您的数据库字段,但是您必须有一种方式来区分它是用户记录还是公司记录,因此您可以检查 – Mandeep 2014-09-05 13:11:01

+0

以及:company_name是公司注册表单所特有的,所以尝试验证:company_name,presence:true,如果:: record_is_company? def record_is_company? company_name结束,但这似乎没有工作,因为错误消息正在为每个表单抛出 – Richlewis 2014-09-05 13:18:14

2

有多种解决方案。

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

IMO最干净的是使用非持久模型,每个表单一个,并从它们创建用户模型。

这将持续的(域)模型与窗体表示分离。由于Rails提倡对模型进行验证,但没有简单的方法来分离上下文,创建表单模型有时比尝试对所有事物进行条件化更麻烦和维护。当它超过一个或两个条件时尤其如此。