Если единственной разницей между загрузками является пара :class => @class
, не должно быть оснований для двух отдельных действий.
I предполагает следующее:
- Здесь мы работаем с
Upload
объектами (upload.rb
модель, uploads_controller.rb
контроллер) Upload.factory
- это процессорный метод, который обрабатывает и форматирует загружаемые данные, что приводит к полному Upload
объект с файлом и метаданными.
Если это так, вся эта логика контроллера может быть перемещена в модель.Передайте данные в модель с переменными экземпляра (через attr_accessor
, а не путем добавления столбцов).Установите before_create
фильтр на factory
, чтобы он обрабатывал загрузку перед сохранением.
Используйте проверки для обработки ошибок «нет данных».
Вот пример.upload.rb
:
before_create :factory # run your factory method before creating
attr_accessor :form_data, :form_network, :form_title, \ # settable from controller
:form_description, :form_class_id
validates :form_data, :presence => true, :on => :create, \ # fail if no data
:message => "No file data. Please reselect file."
private
def factory
file_name = self.form_data.original_filename
file_contents = self.form_data.read
class = Class.where(:id => self.form_class_id).first # returns Class or nil
# if class is nil, handle it however you need to here
# access self.form_network, self.form_title, self.form_description directly
# ... factory magic ...
end
Теперь ваш контроллер может быть таким аккуратным, как это:
def create
upload_params = params[:upload] || params[:image] || params[:video]
@upload = Upload.new({ :form_data => upload_params[:data],
:form_network => @uploader, # <-- undefined!
:form_class_id => upload_params[:class_id],
:form_title => upload_params[:title],
:form_description => upload_params[:description]})
if @upload.save
redirect_to @upload
else
render :action => "new"
end
end
Обратите внимание, что @uploader
не определено.
@upload.save
подтвердит @upload
.Если данные файла отсутствуют, save
не удастся, и вы вернетесь к действию new
с сообщением об ошибке «нет данных».В противном случае, если проверка прошла успешно, вызывается factory
, тогда запись сохраняется.