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 %>

また、チェックボックスの直後にobjective-errors 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 に答える