Исключение скрепки: Paperclip:: AdapterRegistry:: NoHandlerError
Использование Paperclip 3.0.1 в рельсах 3.2.2 Я получил эту ошибку:
**Paperclip::AdapterRegistry::NoHandlerError**
(No handler found for "2009-11-29-133527.jpg"):
В моей модели у меня есть:
class Product < ActiveRecord::Base
...
has_many :assets
accepts_nested_attributes_for :assets
end
class Asset < ActiveRecord::Base
belongs_to :product
has_attached_file :image,
:path => ":rails_root/public/system/:attachment/:id/:style/:filename",
:url => "/system/:attachment/:id/:style/:filename",
:styles => { :medium => "300x300>", :thumb => "100x100>" }
end
Исключение составляет:
def create
**@product = Product.new params[:product]**
...
end
с параметрами:
{...,
"product"=>{"title"=>"wibble1",
**"assets_attributes"=>{"0"=>{"image"=>"2009-11-29-133527.jpg"}
},**
"description"=>"Who is wibble...",
"price"=>"23.45"
},
"commit"=>"Create Product",
...}
Кто-нибудь знает, что происходит?
Ответы
Ответ 1
Эта ошибка возникает, потому что вы не даете Paperclip правильный класс. Это просто строка.
Вы должны получить что-то вроде этого в params
"asset"=>
{"image"=>
#<ActionDispatch::Http::UploadedFile:0x000000056679e8
@content_type="image/jpg",
@headers= "Content-Disposition: form-data; name=\"asset[image]\";
filename=\"2009-11-29-133527.jpg\"\r\nContent-Type: image/jpg\r\n",
@original_filename=""2009-11-29-133527.jpg"",
@tempfile=#<File:/tmp/RackMultipart20120619-1043-yvc9ox>>}
И вы должны иметь что-то подобное в yout View (в HAML, очень упрощенном):
= form_for @product, html: { multipart: true } do |f|
= f.fields_for :asset do |asset_form|
= asset_form.file_field :image
Не забудьте установить форму multipart: true
.
Ответ 2
Я сам столкнулся с этой проблемой. В моем случае это было вызвано пропуском объявления множественной формы в разметке.
Я использовал formtastic, поэтому я добавил это и получил его работу:
semantic_form_for @picture, :html => {:multipart => true} do |f|
Ответ 3
Обратите внимание, что при работе с холстом HTML5 стоит отметить ситуацию. Получение данных холста в виде строки DataURI и отправка этого на сервер может вызвать эту ошибку. Canvas.toDataURL() даст что-то вроде "data: image/png; base64, iVBORw0KGg...", которое вы можете отправить на сервер с другой информацией, поэтому он отличается от стандартной загрузки нескольких частей. На стороне сервера, если вы просто установите это в поле вложения paperclip, вы получите эту ошибку. Вам нужно преобразовать его в файл или объект ввода-вывода. Вы можете написать временный файл, например:
data_uri = params[:canvasDataUri]
encoded_image = data_uri.split(",")[1]
decoded_image = Base64.decode64(encoded_image)
File.open("signature.png", "wb") { |f| f.write(decoded_image) }
или используйте Ruby StringIO, который действует как интерфейс файла с памятью
@docHolder.document = StringIO.new(decoded_image)
Надеюсь, что это поможет.
Ответ 4
У меня было <input type="file" ... multiple="multiple">
на входе файла, поэтому данные вложений в paperclip были в массиве.
Я решил это просто, удалив несколько атрибутов при вводе файла.
Ответ 5
Я уверен, что ваша проблема связана с формой form_for в представлении,
попробуйте что-то вроде этого:
<%= form_for @restaurante, :html => { :multipart => true } do |form| %>
Nome:<%= form.text_field :nome%>
Endereço:<%= form.text_field :endereco %>
Especialidade:<%= form.text_field :especialidade %>
Foto:<%= form.file_field :foto %>
<%= form.submit 'create'%>
<% end %>
Ответ 6
моя проблема не принимала метод get в маршрутах, поэтому я изменил его как метод патча, и он отлично работает.
<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
Ответ 7
Удостоверьтесь, что вы перенесите базу данных после установки Paperclip ('rake db: migrate')... Кроме того, вам может потребоваться добавить новые поля данных, созданные программой Paperclip, в вашу строку 'attr_accessible' в модели.
У меня была аналогичная проблема, когда я пытался получить работу Paperclip по одному из моих проектов.
Ответ 8
Я столкнулся с той же проблемой, я думаю, что это потому, что есть две таблицы, разделяющие один и тот же attached_file_name
... В моем случае я добавляю столбец :photo
как к действиям, так и к твитам, тогда случай кажется что система может найти одну из них, но не другую. Поскольку файлы сохраняются в пути /public/photo/:id/:id
, если у вас есть два столбца, названных как photo
, тогда проблема возникает, я думаю.
Ответ 9
для меня проблема была такой:
Я использовал такую строку в контроллере, как видел ее в некоторых ответах:
@image = User.find(params[:id]).image.<b>path</b>(:small)
и у меня возникла проблема "без обработчика файла"
поэтому, я просто удалил "путь", и он сработал:
@image = User.find(params[:id]).image(:small)
Ответ 10
В моем случае я передавал String, как в ответе @MauricioPasquierJuan, но я не использовал форму, поэтому остальная часть ответа не применяется.
Я не мог найти документацию о том, как программно обновлять вложение - какие типы могут быть назначены, и почему назначение и сохранение измененной записи не сохраняет измененные вложения. Этот вопрос был самым близким, что я нашел.
Внутри функции, обрабатывающей файлы внутри загруженного zip файла, после сохранения извлеченных файлов в файлы temp это мое решение:
record.attachment = File.new( tempfile_path_as_string ) ## probably not the only option
record.attachment.save ## next line doesn't update attachment without this
record.save