【问题标题】:Validation across two forms跨两种形式的验证
【发布时间】:2014-10-30 09:23:24
【问题描述】:

我有一个注册流程,其中包含两个注册表单,具体取决于您是个人还是公司,两者都发布到同一模型(具有设计的用户)。我正在模型中设置验证,但想知道如何为每个表单上不同的输入字段设置验证。

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

【问题讨论】:

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


    【解决方案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    
    

    【讨论】:

    • 谢谢,所以如果我有一个隐藏字段 company_form,值::true,在 record_is_company 内?方法我会放 company_form 吗?
    • @Richlewis 是的,应该这样做,但是除了添加额外的隐藏字段之外,您还可以检查用户和公司不同的字段。我不知道您的数据库字段,但您必须有一种方法可以区分它是用户记录还是公司记录,以便您检查
    • 好吧 :company_name 是公司注册表单所独有的,所以尝试过验证 :company_name,presence: true,if: :record_is_company? def record_is_company? company_name 结束,但这似乎不起作用,因为每个表单都会抛出错误消息
    • @Richlewis 这是因为当 company_name 为 nil 时,您的条件方法不会返回任何内容,因此您的验证不会被触发。更新我的答案
    • @Richlewis 是的,你是对的。我们必须创建一个虚拟属性,然后将其设置为隐藏字段。更新了我的答案
    【解决方案2】:

    有多种解决方案。

    一个简单的方法是使用条件验证,但这会变得混乱。

    IMO 最简洁的是使用非持久化模型,每个表单一个,并从中创建用户模型。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多