Ruby on Rails: неверная вложенная запись сохраняется - PullRequest
0 голосов
/ 13 августа 2011

У меня есть модель NewsItem, которая has_many :attachments.В новой форме NewsItem пользователь может создавать вложения элемента, используя вложенную форму.

Attachment состоит из title и file (который загружен).Модель выполняет проверку наличия обоих этих полей.

Однако, если я оставлю поля для нового вложения пустыми и нажму кнопку отправки, я получу правильные сообщения об ошибках («заголовок не долженбыть пустым "и т. д.), но вложение все же сохраняется с обоими (недопустимыми) значениями.

Единственный соответствующий код, который я могу придумать, это та часть, где я вызываю @news.saveв create методе NewsItemController:

respond_to do |format|
  if @news.save
    flash[:success] = t( 'news.flash.created' )
    format.html { redirect_to news_index_path }
  else
    format.html { render :action => "new" }
  end
end

Все остальное должно обрабатываться рельсами (Новости accepts_nested_attributes_for :attachments, :allow_destroy => true).

Любые идеи о том, что я делаю неправильноздесь?

Обновление:

Похоже, :reject_if -параметр accepts_nested_attributes_for - это почти то, что мне нужно.К сожалению, вы можете только молча «игнорировать» недействительные записи.Я хочу, чтобы пользователь получил сообщение об ошибке, если одно из двух полей пустое.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Я наконец-то решил это, выполнив довольно тяжелый обходной путь.

Я сейчас делаю использую: reject_if для отклонения недействительных вложений. Однако, поскольку это само по себе не приводит к желаемым сообщениям об ошибках, я должен вручную проверить часть вложений хэша params на наличие ошибок, создав новое вложение для каждой записи и проверив, действительна ли она. Затем я заполняю массив ошибок родительского объекта связанными сообщениями об ошибках.

Я знаю довольно неудобное решение ... но, по крайней мере, оно работает.

0 голосов
/ 13 августа 2011

Попробуйте использовать : inverse_of :

class NewsItem < ActiveRecord::Base
  has_many :attachments, :inverse_of => :news_item
end

class Attachment < ActiveRecord::Base
  belongs_to :news_item, :inverse_of => :attachments
end
...