39

Вопрос по ruby-on-rails – Исключение скрепки: Скрепка :: 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", 
             ...}

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

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

    от
  • Error: User Rate Limit Exceeded

    от
  • В случае form_tag это должно бытьform_tag path, :multipart => trueError: User Rate Limit ExceededLink

    от
  • Error: User Rate Limit Exceeded

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

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

    от Sten Ka Razin
  • Да, не забудьте установить опцию multipart. Например: & lt;% = form_for @video,: method = & gt; : put,: html = & gt; {: multipart = & gt; true} do% & gt;

    от
  • Хах! Спустя почти три года, и я столкнулся именно с этим на другом проекте, и, как и раньше, этот ответ и мой комментарий решили мою проблему.

    от
  • @Imran Как вы выбираете это? Это звучит как другой вопрос на самом деле

    от
  • Что в случае, если я выбираю изображение из активов.

    от
  • Это была и моя проблема. Мне понравилось удобство:multiple => true, но, как вы говорите, он устанавливает имя какupload[upload][], Однако мне очень нравится удобство выбора нескольких файлов, поэтому я просто устанавливаю имя вручную, чтобы не быть массивом с:name => 'upload[upload]'.

    от
  • Я добавляю несколько с Javascript вместе с JQuery FileUpload;)

    от
11 ответов
  • 1

    Я почти уверен, что ваша проблема с 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 %>
    

  • 2

    я имел 

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

  • 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.

  • 0

    Убедитесь

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

  • 0

    В моем случае я передавал String

    как в ответе @ 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
    

  • 0

    для меня проблема была такая:

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

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

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

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

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

  • 0

    Когда мы обновили с 4.2.x до 4.3.x

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

  • 0

    Я столкнулся с той же проблемой

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

  • 27

    Я просто столкнулся с этой проблемой сам. В моем случае это было вызва

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

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

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

  • 2

    моя проблема не принимала метод get в маршрутах

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

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

  • 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)
    

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