Как я могу использовать Rails update_attributes для загрузки файла? - PullRequest
2 голосов
/ 15 февраля 2011

Мой метод обновления контроллера продукта определяется следующим образом:

def update
  @product = Product.find(params[:id])

  if params[:product][:image_path]
    # Check if this product already has an image
    File.delete(@product.full_image_path) if File.exist?(@product.full_image_path)
    # Upload the new image
    uploaded_img = params[:product][:image]
    @product.image_path = Time.now.to_i.to_s + File.extname(uploaded_img.original_filename)
    File.open(@product.full_image_path, 'w') do |file|
      file.write(uploaded_img.read)
    end
  end

  @product.name = params[:product][:name]
  @product.description = params[:product][:description]

  respond_to do |format|
    if @product.errors.count == 0
      format.html { redirect_to products_path, :notice => t(:product_updated) }
      format.xml { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml { render :xml => @product.errors, :status => :unprocessable_entity }
    end
  end
end

Это просто удаляет старое изображение, если оно уже есть, и загружает новое. Также обновляет атрибуты продукта

Как я могу использовать @product.update_attributes(params[:product]), чтобы избежать обновления атрибутов имени и описания, как я это сделал здесь?

Если я делаю @product.update_attributes(params[:product]), я получаю сообщение об ошибке, потому что хэш params содержит значение с именем «image», которое не является атрибутом объекта.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Вы можете создать установщик атрибутов для изображения в модели Продукта с именем image=:

def image=(uploaded_img)
  # Check if this product already has an image
  File.delete(full_image_path) if File.exist?(full_image_path)
  # Upload the new image
  image_path = Time.now.to_i.to_s + File.extname(uploaded_img.original_filename)
  File.open(full_image_path, 'w') do |file|
    file.write(uploaded_img.read)
  end
end

После этого удалите оставшуюся часть кода в контроллере и используйте @ product.update_attributes (params [: product]). Я не пробовал, но думаю, что это должно сработать.

Знаете ли вы, что у вас есть несколько драгоценных камней, которые позволяют легко управлять загрузкой файлов, например https://github.com/jnicklas/carrierwave или https://github.com/thoughtbot/paperclip

0 голосов
/ 15 февраля 2011

Вы должны попытаться немного реорганизовать свой контроллер, контроллер не должен запускать какие-либо другие задачи, кроме направления трафика ваших моделей и представлений.Попробуйте переместить все ваши файловые операции в отдельного помощника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...