Подтвердить что ты не робот

Исключение скрепки: 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", 
             ...}

Кто-нибудь знает, что происходит?

4b9b3361

Ответ 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