ドキュメントとウィキに従ってクライアント側の検証(3.2.1)とネストされたフォーム(0.3.1)を設定すると、既存のネストされたフィールドの一意性が誤って検証されていることを除いて、すべてがうまく機能しています。それらは新しいレコードとして見られています。ネストされたフォーム内の既存のネストされていないフィールドは、期待どおりに検証されます。検証がない場合、ネストされたすべてのフィールドは完全に保存および更新されます。
これが私のコードです:
_form.html.erb
<%= nested_form_for(@package, :validate => true) do |f| %>
<%= render 'common/error_messages', :target => @package %>
<div class="clearfix">
<%= f.label :id %>
<div class="input"><%= f.text_field :id, :readonly => "readonly" %></div>
</div>
....................
<h3>Events</h3>
<div class="clearfix">
<%= f.fields_for :packvents %>
<%= f.link_to_add image_tag("icons/plus_16.png"), :packvents %> Add Event
</div>
<div class="actions">
<a><%= f.submit "Save package","class" => "btn primary",:id => "submitBtn" %> </a>  <a><%= link_to 'Cancel', :back,"class" => "btn" %></a>
</div>
<% end %>
_packvent_fields.html.erb
<div id="event" class="clearfix" >
<%= f.link_to_remove image_tag("icons/delete_16.png"),:class => "event-delete"%>
<div class="event_input"><%= f.select :event_id, grouped_options_for_select(Pevent.for_select(current_user), selected_key = f.object.event_id, prompt = nil),{},{:validate => true, :class => 'new_event'} %></div>
</div>
新しいフィールドを動的に追加することは、ネストされたフォームのwikiコードと組み合わせたクライアント側の検証コールバックを介して正常に機能します。
rails.validations.callbacks.js
window.ClientSideValidations.callbacks.element.fail = function(element, message, callback) {
callback();
if (element.data('valid') !== false) {
$('#submitBtn').prop('disabled', true);
element.parent().find('.message').hide().show('slide', {direction: "up", easing: "easeOutBounce"}, 500);
}
}
window.ClientSideValidations.callbacks.element.pass = function(element, callback) {
// Take note how we're passing the callback to the hide()
// method so it is run after the animation is complete.
element.parent().find('.message').hide('slide', {direction: "up"}, 500, callback);
$('#submitBtn').prop('disabled', false);
}
application.js
$(document).ready(function() {
$('form').on('nested:fieldAdded', function(event) {
$(event.target).find(':input').enableClientSideValidations();
})
});
余分なdivやクラスなどをすべて削除する場合と同様に、コールバックを完全に削除しても効果はありません。基本検証に「作成/保存時」条件を追加することはできません。フィールドが動的に追加されるため、機能する必要があります。
packvent.rb
:event_id、:uniqueness => {:scope =>:package_id}を検証します
どんな考えでも大歓迎です。
編集:さらに奇妙なことに、グループ内の最後のフィールドセットは、それが1つだけであっても、正しく検証されます。複数のセットと関係があります...