3

Rails3.1.0rc4とclient_side_validations3.1.0を使用しています。フォームがメインリクエストでレンダリングされる限り、すべてが完全に機能します。ただし、フォーム自体がjavascriptを介してページに追加された場合、フォームを送信するとサーバー側で検証されます。問題は、フォームがjavascriptを介してページに追加されるときに、クライアント側の検証機能を何らかの方法でページに「バインド」する必要があることだと思います。

たとえば、新しい求人情報を投稿できる簡単なフォームがあるとします。

#jobs/new.html.erb
<%= form_for [@job], :validate => true  do |f| %>

  <%= render :partial => 'common/form_errors', :locals => {:record => @job} %>

  <div class="field">
      <%= f.label :title %>
      <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %>
    <%= f.text_field :description %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

そして私のモデルの次の検証:

class Job < ActiveRecord::Base
  validates_presence_of :title, :description
end

ブラウザでnew_job_pathにアクセスしてこのフォームにアクセスすると、クライアント側の検証がうまく機能します。

ただし、このフォームを別のページ(たとえば、jobs_pathインデックスページ)に次のように挿入すると、次のようになります。

#jobs/index.html.erb
<%= render @jobs %>

<div id="form-job-new"> </div>

<%= link_to 'New Job', new_job_path, :remote =>true %>

と:

#jobs/new.js.erb
$('#form-job-new').append("<%= escape_javascript render(:file => 'jobs/new.html.erb') %>");

次に、フォームが送信されると、検証がサーバー側に適用されます。

私が欠けているものはありますか?

4

2 に答える 2

8

このgemのjavascriptソースコードで答えが見つかりました:

// Main hook
// If new forms are dynamically introduced into the DOM the .validate() method
// must be invoked on that form
$(function() { $('form[data-validate]').validate(); })

したがって、私の特定のケースでは、次のことを行う必要がありました。

#jobs/new.js.erb
$('#form-job-new').append("<%= escape_javascript render(:file => 'jobs/new.html.erb') %>");
$('form[data-validate]').validate();
于 2011-07-19T19:38:20.527 に答える
3

ujsをどれだけ使用するか(私はよく行う)によっては、すべてのujsファイルでvalidateメソッドを呼び出す代わりに、このようなことを行う方が理にかなっている場合があります。

$('body').bind("ajax:success", function() {
   if($('form[data-validate]').length){
      $('form[data-validate]').validate();
   }
});

またはcoffeescript

$("body").bind "ajax:success", ->
  $("form[data-validate]").validate()  if $("form[data-validate]").length
于 2012-05-16T21:05:54.893 に答える