Формы Rails 3.1 Ajax не показывают проверку

#ruby-on-rails-3.1

#ruby-on-rails-3.1

Вопрос:

Я использую обновленный предварительный Ruby on Rails на Ruby 1.9.2 (с rvm) и создал новое тестовое приложение с

 $ rails generate scaffold Project name:string 
  

и

 class Project < ActiveRecord::Base
  validates_presence_of :name
end
  

Я меняю

 <%= form_for @project do |f| %>
  

Для

 <%= form_for @project, :remote => true do |f| %>
  

Теперь я все еще могу (без каких-либо изменений в контроллере) добавлять новые элементы в проект. Если я попытаюсь добавить с пустым в поле name, это ничего не добавит (validate_presence_of:name останавливает это), но я не получаю никаких сообщений об ошибках проверки. Я пробовал то же самое в приложении, преобразованном из версии 3.0, над которым я работаю, с теми же результатами. Здесь у меня было:

 class KursController < ApplicationController
  # GET /kurs
  # GET /kurs.xml
  respond_to :js, :html
  

и:

 def update
  @kur = Kur.find(params[:id])
  @kur.update_attributes(params[:kur])
  flash[:notice] = "Lagret" if @kur.save
  respond_with( @kur, :layout => !request.xhr? )
end
  

В 3.1 я не получаю сообщений об ошибках проверки. Это из-за ошибки в Ruby on Rails 3.1 или что-то, что я должен сделать по-другому?

Ответ №1:

Вам не хватает для вызова этих ошибок. Сделайте что-то вроде этого:

 <%= form_for @project do |f| %>
<%= render :partial => 'my_error_messages_for', :locals => {:collection => @project} %>
  

В «_my_error_messages_for.html.erb»:

 <% if collection.errors.any? %>
  <ul>
    <% collection.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
  </ul>
<% end %>
  

Вы можете создать помощник для этой работы.

Комментарии:

1. Это не исправляет проблему. Я получаю сообщения об ошибках с обычными формами. Это Ajax-формы («:remote => true»), которые не показывают ошибок. Может быть, мне нужно перехватывать сообщения об ошибках в файле js.erb?

Ответ №2:

Я не верю, что Ruby on Rails автоматически включит запрошенную вами часть. Вам нужно будет добавить некоторый код JavaScript, чтобы заставить его работать правильно. Что-то вроде этого я представляю:

 // Application.js
$("form").bind("ajax:success", function (event, data, status, xhr) {
    $(event.target).replaceWith(data);
});