2013-11-19 2 views
1

Я слежу за рельсами, отлитыми 263 на стороне клиента. У меня есть код на месте, хотя он не подтверждает ошибки для меня. Ошибки отображаются только после отправки формы.Проверка на стороне клиента не загружается

application.html.erb:

<%= stylesheet_link_tag "application", :media => "all" %> 
    <%= javascript_include_tag "application" %> 
    <%= javascript_include_tag :defaults, "rails.validations" %> 
    <%= csrf_meta_tags %> 

client_side_validations.rb:

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance| 
    unless html_tag =~ /^<label/ 
    %{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe 
    else 
    %{<div class="field_with_errors">#{html_tag}</div>}.html_safe 
    end 
end 

form.html.erb:

<%= form_for @user, :validate => true do |f| %> 
    <% if @user.errors.any? %> 
    <div class="error_messages"> 
     <h2>Form is invalid</h2> 
     <ul> 
     <% @user.errors.full_messages.each do |message| %> 
      <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
     <%= f.label :email %><br/> 
     <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
     <%= f.label :password %><br/> 
     <%= f.password_field :password %> 
    </div> 
    <div class="field"> 
     <%= f.label :username %><br/> 
     <%= f.text_field :username %> 
    <div class="field"> 
     <%= f.label :zip_code %><br/> 
     <%= f.text_field :zip_code %> 
    </div> 
    </div> 

application.js:

//= require jquery 
//= require jquery.ui.all 
//= require jquery_ujs 
//= require jquery.magnific-popup.js 
//= require jquery.purr 
//= require rails.validations 
//= require best_in_place 
//= require_tree . 
+0

Когда вы убираете поле с установленными валидностями, необходимо запустить код JavaScript client_side_validations в файле rails.validation.js. Если вы отлаживаете JS в своем браузере, это код внутри 'executeValidates = function (context)' firing? – cschroed

+0

@cschroed Когда я просматриваю исходный код страницы, я фактически получаю «Сбой при загрузке ресурса: сервер ответил статусом 404 (не найден)». Исходя из ссылки http: // localhost: 3000/javascripts/defaults.js. Может быть, это и есть причина? –

+0

Да, это, кажется, начало проблемы. Я предложил альтернативный вариант. – cschroed

ответ

3

Оригинальное предложение: Ссылка на JS в application.js.

Вместо ссылки на rails.validations.js из application.html.erb:

<%= javascript_include_tag :defaults, "rails.validations" %> 

Вы можете сделать это в вашем файле app/assets/javascripts/application.js:

//= require rails.validations 

Вот как я связываю в дополнительные файлы JavaScript.

Я не знаю много о Rails 2, но я думаю, что произошел сдвиг в Rails 3, так что теперь application.html.erb используется для ссылки на application.js, а затем все другие JS-файлы связаны с ними. Похоже, :default может не работать так, как раньше. RailsCasts очень полезны, но некоторые из эпизодов, которые были созданы несколько лет назад, имеют образцы кода, которые были изменены в последних версиях Rails.

Редактировать 1: Убедитесь, что rails.validations.js установлен в app/assets/javascripts.

В RailsCast команда rails g client_side_validations:install помещает rails.validations.js в проект. По-видимому, это не всегда работает, и вы можете позвонить rails g client_side_validations:copy_assets, чтобы он упал на app/assets/javascripts (см .: Can't include js file for client slide validation).

Редактировать 2: В Rails 4 исправить ошибки совместимости.

Похоже, что client_side_validations не работает в Rails 4, и драгоценный камень больше не поддерживается (см.: https://github.com/bcardarella/client_side_validations).

В Rails 3, в action_view\helpers\form_helper.rb, метод apply_form_for_options! является:

def apply_form_for_options!(object_or_array, options) 

В Rails 4, это:

def apply_form_for_options!(record, object, options) 

Если вы посмотрите на код client_side_validations, его версия:

def apply_form_for_options!(object_or_array, options) 
    super 
    options[:html][:validate] = true if options[:validate] 
end 

Это соответствует определению Rails 3.Мы получаем только два аргумента, но затем вызываем super, который взрывается, потому что Rails 4 ожидает три аргумента.

Если вы чувствуете себя храбрым, вы можете расколоть жемчужину client_side_validations и решить эти проблемы с Rails-4. Но я бы заподозрил, что может быть достаточно нескольких штук для обновления, так как этот драгоценный камень должен быть настолько тесно интегрирован с FormHelper.

Извините, что это не сразу решает проблему. Удачи!

+0

Это не работает. '[Ошибка] ReferenceError: не удается найти переменную: jQuery (анонимная функция) (rails.validations.js, строка 5)' –

+0

Это означает, что мы теперь подключены к rails.validations.js, но он не знает, что такое jQuery является. У вас есть «gem» jquery-rails'', установленный в вашем приложении? И у вас '// = требуется jquery' в' application.js'? – cschroed

+0

Да, у меня есть и там –

Смежные вопросы