在Rails 3 AJAX表单中,通过客户端验证gem中的has\u many:through关联未选中复选框时显示验证错误

在Rails 3 AJAX表单中,通过客户端验证gem中的has\u many:through关联未选中复选框时显示验证错误,ajax,ruby-on-rails-3.2,client-side-validation,Ajax,Ruby On Rails 3.2,Client Side Validation,在这个表单中,所有其他验证都会收到很好的内联错误消息,但无论我尝试了什么,在点击这些复选框的提交后,我似乎都找不到任何消息显示出来。验证正在进行中,因为在我选中一个复选框之前表单不会提交,但我希望看到用户的一些反馈 我的模型(精简): 类资源:破坏 有许多:目标,:通过=>:障碍 验证是否存在:目标\u ID,:message=>“必须至少检查一个” 终止 类目标:破坏 有很多:资源,:通过=>:障碍 终止 我认为的形式(精简): true,:html=> @resource.skill\u

在这个表单中,所有其他验证都会收到很好的内联错误消息,但无论我尝试了什么,在点击这些复选框的提交后,我似乎都找不到任何消息显示出来。验证正在进行中,因为在我选中一个复选框之前表单不会提交,但我希望看到用户的一些反馈

我的模型(精简):

类资源:破坏
有许多:目标,:通过=>:障碍
验证是否存在:目标\u ID,:message=>“必须至少检查一个”
终止
类目标:破坏
有很多:资源,:通过=>:障碍
终止
我认为的形式(精简):

true,:html=>
@resource.skill\u id%>
“目标有针对性(至少1)”,:collection=>Skill.find(“#{@resource.Skill_id}”).Objectives,:as=>:复选框,:label_method=>lambda{{124; objective |“#{objective.content}”}%>

如果您有任何想法,我们将不胜感激

然后……我算出来了——算是吧。我仍然无法让客户端验证为我的复选框抛出错误,但当我尝试提交表单时,我可以让控制器呈现相同的create.js.erb,无论是否成功保存,然后在其中显示错误消息,如下所示:

<% if @resource.errors.any? -%> 
  $('#objective-errors<%= @resource.skill_id %>').empty();
  $('#objective-errors<%= @resource.skill_id %>').prepend('<%= j render("errors") %>');
<% else %>
  // Whatever you want to happen on successful save
<% end %>

$(“#客观错误”).empty();
$(“#客观错误”)。前置(“”);
//成功保存后,无论您希望发生什么
我还在复选框后面添加了一个带有客观错误id的空白范围,以便错误像所有其他验证错误一样以内联方式显示。这有点混乱,但碰巧起作用,因为客户端验证确保在尝试保存之前验证所有其他内容,因此保存失败后返回的唯一错误恰好是我的目标

因此,在我想添加另一组复选框之前,这非常有效!(虽然如果我曾经这样做过,过滤消息以显示在相应的复选框列表旁边应该不会太困难。)

为了它的价值(4.5年后),我发现了一些技巧。在我的例子中,复选框是一个免责声明,用户在继续之前必须接受。由于选中和取消选中复选框实际上不会更改值,客户端验证库使用输入值,因此我只添加了模型级验证,并在jQuery中更改了输入值,这在触发客户端验证库方面起到了作用

在我的模型中,我添加了:

validates :field, inclusion: { in: [ true, 'true' ] }
然后,在视图上的JS中:

// For active toggling of checkbox
$('input#reference_finalization_referee_available').click( function() {
    if($(this).is(':checked')){
        $(this).val('true')
    } else {
        $(this).val('false')
    }
});

// On page load
if ($('input#reference_finalization_referee_available').is(':checked')) {
    $(this).val('true')
} else {
    $(this).val('false')
}
有点像黑客,但确实有办法

validates :field, inclusion: { in: [ true, 'true' ] }
// For active toggling of checkbox
$('input#reference_finalization_referee_available').click( function() {
    if($(this).is(':checked')){
        $(this).val('true')
    } else {
        $(this).val('false')
    }
});

// On page load
if ($('input#reference_finalization_referee_available').is(':checked')) {
    $(this).val('true')
} else {
    $(this).val('false')
}