验证rails模型中的单选按钮和复选框

时间:2016-01-27 05:05:11

标签: ruby-on-rails forms validation ruby-on-rails-4 checkbox

概述

在我看来,我有两位radio_button表单助手:YesNo

我还有一个check_box,标识符为:agreement

这是我的代码:

%h6 Is this a membership?   

= f.radio_button :agreement, true, id: "membership_yes" 

= f.label :agreement, "Yes", value: true

= f.radio_button :agreement, false, id: "membership_no" 

= f.label :agreement, "No", value: false

%br/ 

= f.check_box :agreement, type: "checkbox", id: "agreement-box"
= f.label :agreement, label: "I acknowledge that I have completed at least 8 workouts for the month."

我想要完成的事情

在我的rails模型中,我想在:agreement复选框上执行验证。

如果选择Yes,则显示复选框并将其设为必填项。如果选择了No,则隐藏该复选框并使其不是必需的。

我非常感谢任何有助于我指明正确方向的帮助或资源。

我尝试了什么

我尝试使用Jquery隐藏,显示并将复选框的id属性设置为required或{{1},同时提供单选按钮和复选框false }。

我只能显示和隐藏复选框。将true属性设置为requiredtrue时,无论我按下false按钮

,都会将其忽略并提交表单

如果有更好的方法来组织我的代码,我将不胜感激。提前致谢!

1 个答案:

答案 0 :(得分:3)

首先,为模型中的单选按钮添加属性访问器。

attr_accessor :show_agreement

更改表单

%h6 Is this a membership?   

= f.radio_button :show_agreement, true, id: "membership_yes", name: "agreement_radio_buttons" 

= f.label :show_agreement, "Yes", value: true

= f.radio_button :show_agreement, false, id: "membership_no", name: "agreement_radio_buttons" 

= f.label :show_agreement, "No", value: false

%br/

#agreement-box
   = f.check_box :agreement, type: "checkbox"
   = f.label :agreement, label: "I acknowledge that I have completed at least 8 workouts for the month."

单选按钮更改时显示/隐藏复选框,

$(document).ready(function(){ 
    $("input[name$='agreement_radio_button']").click(function() {
        var showCheckBox = $(this).val();
        if (showCheckBox) {
            $("#agreement-box").show();
        } else {
            $("#agreement-box").hide();
            $("#agreement-box input").prop('checked', false);
        }
    }); 
});

最后但并非最不重要的是,在模型中添加验证,

validates :agreement, acceptance: {accept: true}, if: :needs_agreement_acceptance?

private

def needs_agreement_acceptance?
    show_agreement
end

我还没有测试过,但我想你会好的。 此外,确保在(重新)加载页面时显示或隐藏协议框,具体取决于单选按钮的预选。

关于不提交表单

您可以停用提交按钮,并选中更改复选框的时间。如果是,请删除禁用attr。

$('#agreement_box').on('change', 'input', function() {
    if (self.is(":checked")) {
        $('#submit-btn').removeAttr('disabled')
    } else {
        ...
    }
});

很抱歉没有更彻底