1

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

我的模型(精简):

class Resource < ActiveRecord::Base
  attr_accessible :objective_ids

  has_many :obsources, :dependent => :destroy
  has_many :objectives, :through => :obsources

  validates_presence_of :objective_ids, :message => "Must check at least one"
end

class Objective < ActiveRecord::Base
  has_many :obsources, :dependent => :destroy
  has_many :resources, :through => :obsources
end

我认为的形式(精简):

<%= simple_form_for @resource, remote: true, :validate => true, :html => { :id => "resource-form#{@resource.skill_id}" } do |f| %>
  <%= f.hidden_field :skill_id, :value => @resource.skill_id %>
  <%= f.association :objectives, :label => "Objectives Targeted (at least 1)", :collection => Skill.find("#{@resource.skill_id}").objectives, :as => :check_boxes, :label_method => lambda { |objective| "#{objective.content}" } %>
  <%= f.submit %>
<% end %>

想法将不胜感激!

4

2 回答 2

0

而且......我想通了 - 有点。我仍然无法让 client_side_validations 为我的复选框抛出错误,但是当我尝试通过让我的控制器呈现相同的 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 %>

我还在复选框之后添加了一个带有目标错误 id 的空范围,以便错误显示为内联,就像所有其他验证错误一样。这有点混乱,但碰巧可以工作,因为 client_side_validations 确保在尝试保存之前验证其他所有内容,因此在保存不成功后返回的唯一错误恰好是我的目标。

所以在我想添加另一组复选框之前,这很好用!(尽管我曾经这样做过,过滤消息以显示在适当的复选框列表旁边应该不会太难。)

于 2012-12-21T20:20:16.530 回答
0

对于它的价值(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')
}

有点黑客,但确实有效。

于 2017-05-14T21:32:56.630 回答