processeurs d'exécution sur Paperclip style sélectionné
-
19-09-2019 - |
Question
J'ai un: processeur d'image xxx, et j'ai deux styles dans le modèle: grand et:. Pouce
Comment puis-je traiter avec: xxx seulement: l'image du pouce en laissant la: grande image intacte
La solution
Par défaut, la tâche Rake rafraîchit toutes les vignettes. Gardez à l'esprit qu'il ne touche pas / traiter l'image d'origine.
Vous pourriez avoir un regarder Rakefile et attachement classe et modifier pour vous permettre de spécifier une taille de vignette spécifique, mais la conception actuelle suppose que vous voulez prendre l'original et refaire toutes les vignettes de l'original.
Autres conseils
J'ai eu récemment un problème similaire et trouvé cette solution sur un babillard. J'espère que ça aide!
has_attached_file :screenshot,
:default_style => :full,
:styles => {
:full => "280x210",
:cropped => { :processors => [:screenshot_crop] }
}
Ajoutez ce code à votre fichier paperclip.rake:
desc "Reprocesses your attachments style (set CLASS, ATTACHMENT and STYLE)"
task :style => :environment do
module JustForOneDay
NAME = ENV['STYLE']
end
module ::Paperclip
class Attachment
def post_process_styles #:nodoc:
@styles.each do |name, args|
if JustForOneDay::NAME == name
begin
raise RuntimeError.new("Style #{name} has no processors defined.") if args[:processors].blank?
@queued_for_write[name] = args[:processors].inject(@queued_for_write[:original]) do |file, processor|
Paperclip.processor(processor).make(file, args, self)
end
rescue PaperclipError => e
log("An error was received while processing: #{e.inspect}")
(@errors[:processing] ||= []) << e.message if @whiny
end
end
end
end
end
end
for_all_attachments do |instance, name|
result = instance.send(name).reprocess!
end
end
end
Testé avec Paperclip 2.3.1.1
Dans Paperclip 2.3.3 cela devrait être:
def post_process_styles #:nodoc:
styles.each do |name, style|
if JustForOneDay::NAME == name
begin
raise RuntimeError.new("Style #{name} has no processors defined.") if style.processors.blank?
@queued_for_write[name] = style.processors.inject(@queued_for_write[:original]) do |file, processor|
Paperclip.processor(processor).make(file, style.processor_options, self)
end
rescue PaperclipError => e
log("An error was received while processing: #{e.inspect}")
(@errors[:processing] ||= []) << e.message if @whiny
end
end
end
end
Il est facile, il suffit d'aller à attachment.rb fichier dans votre version paperclip.
Je kludged cela - ce n'est pas élégant, mais ça a marché pour moi
.L'un de vos styles doivent avoir des dimensions différentes de tous les autres styles. De cette façon, dans votre processeur Paperclip personnalisé, vous pouvez voir si le contenu de la chaîne de commande contiennent les dimensions données. Dans ce cas, vous feriez un traitement spécial, sinon, vous ne.
(je clipsée ce code - et modifia - de Railscast épisode de Ryan Bate 182.)
module Paperclip
class Cropper < Thumbnail
def transformation_command
SPECIAL_PROCESSING_FLAG = "150x150"
if crop_command && super.include?(SPECIAL_PROCESSING_FLAG)
crop_command + super.sub(/ -crop \S+/, '')
else
super 'do nothing fancy
end
end
def crop_command
target = @attachment.instance
if target.cropping?
" -crop '#{target.crop_w.to_i}x#{target.crop_h.to_i}+#{target.crop_x.to_i}+#{target.crop_y.to_i}'"
end
end
end
end
Dans ma situation, il importait peu que nous retraitée dans le cas non spécial aussi, puisque le résultat final n'a rien changé.