У меня есть ImagesController
, который запускает нетривиальную операцию сохранения. Вот фон высокого уровня:
В моем приложении есть несколько разных типов физических файлов. Каждый из этих belongs_to
a Binary
. Конечно, файлы могут быть созданы, и этот процесс включает в себя загрузку физического файла во временное местоположение, возможно проверку физического файла (по размеру, типу и т. Д.) И затем, без проблем, перемещение файла в постоянное место перед созданием записей базы данных в соответствующих таблицах (для целей моего вопроса используем images
и binaries
).
Image
принадлежит Binary
, а есть BinaryObserver
, который наблюдает за классом Image
. В этом классе наблюдателя есть метод before_create()
, который указывает классу Binary
загрузить физический файл изображения и сохранить соответствующую запись в базе данных (с именем, путем, информацией URI и т. Д.).
Одна из вещей, которую делает метод класса наблюдателя, это проверка метода обратного вызова в исходной модели, Image
в этом случае. Если метод существует и возвращает false по какой-либо причине, то мне нужно, чтобы операция сохранения завершилась неудачно. Я не могу понять, как это сделать правильно.
В методе create()
моего контроллера у меня есть:
if @image.save!
flash[:notice] = "Successfully created image."
redirect_to @image
else
flash[:notice] = "Upload failed."
render :action => 'new'
end
Я не могу понять, как вызвать блок else
. В моем BinaryObserver
классе у меня есть:
def before_create( model )
binary = Binary.new.upload( model.upload )
if !model.respond_to?( 'before_file_save' ) || model.before_file_save()
binary = binary.store()
model.binary_id = binary.id
model.active = 1
return true
else
# binary.destroy()
File.delete( File.join( Rails.root, binary.path ) )
return false
end
end
В данный момент Image.before_file_save()
просто возвращает false. Физический файл удаляется, но сохранение не приводит к ошибке, и мой контроллер отображает сообщение об ошибке, что его метод show()
не может найти изображение (что имеет смысл, так как изображение не было сохранено, а физический файл был удален ).
Как заставить принудительно завершиться операцию сохранения, если метод класса наблюдателя 'before_create()
возвращает false?
Спасибо.