首页 > 解决方案 > 电子邮件/网址的自定义 Rails 表单验证

问题描述

我有一个包含两个单选按钮、电子邮件或 URL 的表单。在我的模型中,这两个字段是必需的,但我只希望其中一个取决于单击的单选按钮。

潜在的解决方案:添加隐藏字段并将参数传递到我可以验证的模型中?

<%= form_for @webhook do |f| %>

    <div class="form-group">
        <div class="checkbox email">
            <label>
                <%= f.radio_button :show_url_form, 0, checked: true %>
                Lorum Ipsum 
            </label>
        </div>
        <div class="checkbox url">
            <label>
                <%= f.radio_button :show_email_form, 1, checked: false %>
                Lorum Ipsum 
            </label>
        </div>
    </div>

    <div class="form-group url">
        <div class="form-group">
            <%= f.hidden_field :perform_validation, value: true %>
            <%= f.label :url %>
            <%= f.text_field :url, class: "form-control", autofocus: true %>
        </div>

    <div class="form-group email" style="display: none;">
        <%= f.label :email %>
        <%= f.text_field :email %>
        <label class="radio-inline">
            <%= f.radio_button :format, 'formatone' %> formatone
        </label>
        <label class="radio-inline">
            <%= f.radio_button :format, 'formattwo' %> formattwo
        </label>
    </div>
<% end %>

模型:

validates :url, presence: true
validates :email, presence: true

标签: ruby-on-rails

解决方案


在您的模型中,您可以向两个验证添加条件...

attr_accessor :skip_url_validations
attr_accessor :skip_email_validations

validates_presence_of :url, unless: :skip_url_validations
validates_presence_of :email, unless: :skip_email_validations

然后在您的控制器中,您可以根据表单传入的参数将skip_url或skip_email设置为true......像这样

@webhook = Webhook.new(webhook_params)
@webhook.skip_email_validations = true if params.has_key?(:url)
@webhook.skip_url_validations = true if params.has_key?(:email)

推荐阅读