Вопрос по ruby-on-rails – Исключение скрепки: Скрепка :: AdapterRegistry :: NoHandlerError

39

Используя 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", 
             ...}

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

Ваш Ответ

11   ответов
2

поэтому я изменил его как метод исправления, и он работает нормально.

<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
1

попробуйте что-то вроде этого:

<%= 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 %>
0

нам пришлось изменить основной атрибут поля скрепки (picture, imageи т. д.) от относительного URL до полного URL, чтобы устранить эту ошибку.

2

я имел<input type="file" ... multiple="multiple"> при вводе файла, поэтому данные вложения скрепки были в массиве. Я решил это, просто удалив несколько атрибутов при вводе файла.

Хах! Спустя почти три года, и я столкнулся именно с этим на другом проекте, и, как и раньше, этот ответ и мой комментарий решили мою проблему.
Я добавляю несколько с Javascript вместе с JQuery FileUpload;)
Это была и моя проблема. Мне понравилось удобство:multiple => true, но, как вы говорите, он устанавливает имя какupload[upload][], Однако мне очень нравится удобство выбора нескольких файлов, поэтому я просто устанавливаю имя вручную, чтобы не быть массивом с:name => 'upload[upload]'.
0

как в ответе @ MauricioPasquierJuan, но я не использовал форму, поэтому остальная часть ответа не применима.

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

В функции, которая обрабатывает файлы внутри загруженного zip-файла, после сохранения извлеченных файлов во временные файлы, это мое решение:

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
5

что при работе с холстом HTML5 есть ситуация, на которую стоит обратить внимание. Получение данных холста в виде строки DataURI и отправка их на сервер может привести к этой ошибке. Canvas .toDataURL () выдаст что-то вроде & quot; data: image / png; base64, iVBORw0KGg ... & quot; которую вы можете отправить на сервер с другой информацией, так что она отличается от стандартной загрузки из нескольких частей. На стороне сервера, если вы просто установите его в поле приложения 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)

Надеюсь это поможет.

StringIO(<your_file_string_representation>) сделал свое дело.
0

я думаю, что это потому, что есть две таблицы с одинаковымattached_file_name... в моем случае я добавляю:photo В столбце, посвященном действиям и твитам, похоже, что система может найти одно из них, а другое - нет. Поскольку файлы сохраняются в/public/photo/:id/:id путь, если у вас есть два столбца, оба названы какphoto, то проблема возникает, я думаю.

45

что вы не предоставляете 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.

@Imran Как вы выбираете это? Это звучит как другой вопрос на самом деле
Что в случае, если я выбираю изображение из активов.
Да, не забудьте установить опцию multipart. Например: & lt;% = form_for @video,: method = & gt; : put,: html = & gt; {: multipart = & gt; true} do% & gt;
В случае form_tag это должно бытьform_tag path, :multipart => trueError: User Rate Limit ExceededLink
0

Я использовал такую строку в контроллере, что видел в некоторых ответах:

@image = User.find(params[:id]).image.<b>path</b>(:small)

и у меня возникла проблема "нет обработчика для файла"

Итак, я только что удалил & quot; путь & quot; и это сработало:

@image = User.find(params[:id]).image(:small)
27

но пропуском объявления разметки в разметке.

Я использовал formtastic, поэтому я добавил это и получил его работать:

semantic_form_for @picture, :html => {:multipart => true} do |f|

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded:html => {:multipart => true}Error: User Rate Limit Exceeded:multipart => trueError: User Rate Limit Exceeded
0

что вы перенастроили базу данных после установки Paperclip («rake db: migrate») ... Также вам может понадобиться добавить новые поля данных, созданные Paperclip, в ваш «attr_accessible». линия в модели. У меня была похожая проблема, когда я пытался заставить Paperclip работать над одним из моих проектов.

к сожалению, это не решает проблему для меня. Та же проблема при добавлении attr_accessible: title,: description,: price,: assets_attributes, Sten Ka Razin

Похожие вопросы