Używam Rails 3.1.0rc4 i client_side_validations 3.1.0. Wszystko działa idealnie, o ile formularz jest renderowany w głównym żądaniu. Jeśli jednak sam formularz zostanie dodany do strony za pomocą javascript, to przesłanie formularza skutkuje walidacją po stronie serwera. Podejrzewam, że problem polega na tym, że gdy formularz jest dodawany do strony za pomocą javascript, muszę jakoś „powiązać” z nim funkcjonalność walidacji po stronie klienta.

Załóżmy na przykład, że mam prosty formularz, w którym możesz opublikować nową ofertę pracy:

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

Oraz następujące walidacje w moim modelu:

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

Jeśli odwiedzę ten formularz, odwiedzając nową_ścieżkę_pracy w mojej przeglądarce, moje walidacje po stronie klienta działają świetnie.

Jeśli jednak wstawię ten formularz na inną stronę (na przykład stronę indeksu job_path) w następujący sposób:

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

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

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

I:

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

Następnie po przesłaniu formularza walidacje są stosowane po stronie serwera.

Masz jakiś pomysł, czego mi brakuje?

3
cailinanne 19 lipiec 2011, 19:54

2 odpowiedzi

Najlepsza odpowiedź

Znalazłem odpowiedź w kodzie źródłowym javascript dla tego klejnotu:

// 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(); })

Tak więc w moim konkretnym przypadku musiałem zrobić:

#jobs/new.js.erb
$('#form-job-new').append("<%= escape_javascript render(:file => 'jobs/new.html.erb') %>");
$('form[data-validate]').validate();
8
cailinanne 19 lipiec 2011, 23:38
Mam ten sam problem, spójrz na to pytanie. stackoverflow.com/questions/17556841 /… Dzięki
 – 
user588324
10 lipiec 2013, 00:43

W zależności od tego, jak często używasz ujs (ja robię dużo), bardziej sensowne może być zrobienie czegoś takiego zamiast wywoływania metody walidacji w każdym pliku ujs.

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

Lub coffeescript

$("body").bind "ajax:success", ->
  $("form[data-validate]").validate()  if $("form[data-validate]").length
3
jBeas 17 maj 2012, 01:05
Mam ten sam problem. Czy możesz spojrzeć na to pytanie. stackoverflow.com/questions/17556841 /… Dzięki
 – 
user588324
10 lipiec 2013, 01:37