2 votes

"Un niveau de pile trop profond" lors du traitement des versions d'images Carrierwave sous forme imbriquée

Il s'agit d'un problème étrange qui, malheureusement, a de nombreuses sources potentielles. J'utilise carrierwave et cocoon gems pour faciliter le téléchargement de fichiers imbriqués. Tout type de traitement de version que je fais dans mon téléchargeur provoque une erreur de niveau de pile trop profond. Si je supprime le traitement, les images imbriquées sont sauvegardées normalement. J'ai essayé de faire beaucoup de dépannage et j'ai réduit le problème à cela ; par exemple, si je supprime seulement le traitement de la version, cela fonctionne normalement. Si je supprime tout sauf le traitement de la version, l'erreur est la même. Il y a beaucoup de sources potentielles, donc voici un peu de code :

formulaire parent (tronqué)

<%= semantic_form_for [@object, @discussion], multipart: true , input_html: {class: "form-horizontal"} do |f| %>
     <div id="pictures">
      <%= f.semantic_fields_for :pictures do |p| %>
        <%= render 'picture_fields', :f => p %>
      <% end %>
      <div class="links">
        <%= link_to_add_association f, :pictures do %>
          <button type="button" class="btn btn-success btn-sm">Add Image</button>
        <% end %>
      </div>
    </div>
 <% end %>

formulaire imbriqué

<div class="nested-fields">
 <div class="row">
  <div class="col-md-10">
    <%= f.input :pic, label: false %>
    <%= f.input :pic_cache, as: :hidden %>    
  </div>
  <div class="col-md-2 pull-right">
    <%= link_to_remove_association f do %>
     <button type="button" class="btn btn-danger btn-sm">REMOVE</button>
    <% end %>
   </div>
  </div>
 </div>

téléchargeur

        # encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  # include Sprockets::Helpers::RailsHelper
  # include Sprockets::Helpers::IsolatedHelper

  # Choose what kind of storage to use for this uploader:
  # storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    if Rails.env.test?
      "uploads/test/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    else
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end
  end

  #custom method to access local files as full paths
  def local_path_or_remote_url
    if CarrierWave::Uploader::Base.storage.to_s == CarrierWave::Uploader::Base.storage_engines[:file]
      path
    else
      url
    end
  end

  # Process files as they are uploaded:
  # process :scale => [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  process :resize_to_fit => [400, 400]

  version :thumb do
    process :resize_to_fill => [72, 72]
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
     %w(jpg jpeg gif png)
  end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  def filename
    "pic#{File.extname(original_filename).downcase}" if original_filename
  end

end

J'ai des téléchargeurs qui utilisent essentiellement le même code sans problème. Ce n'est qu'avec l'imbrication que ce code de versionnement pose des problèmes. Je sais qu'il peut y avoir beaucoup de sources potentielles pour cela. Des idées ?

4voto

Edgar V. Points 41

Cela a fonctionné pour moi.

gem 'rmagick', :require => 'RMagick'

2voto

Marc Points 593

Je suis passé de rmagick à mini_magick et ça marche maintenant...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X