#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);
});