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 ?