2 votes

Comment puis-je passer des valeurs arbitraires définies par l'utilisateur dans un processeur d'images CarrierWave ?

Je travaille donc sur une application rails 3.2 dans laquelle j'ai un uploader CarrierWave ; que j'utilise pour uploader des images, et les découper en plusieurs tailles différentes - des choses assez classiques.

Ce que je voudrais faire, c'est composer une nouvelle image au-dessus de l'image téléchargée, ce qui est également assez simple. (c'est très souvent le cas pour le filigrane). La différence est qu'au lieu d'avoir des valeurs statiques pour positionner l'image composée, j'ai besoin qu'elles soient dynamiques.

Ce qui me pose problème, c'est de savoir comment passer des arguments positionnels dynamiques définis par l'utilisateur dans mon processeur carrierwave dans le bloc "version".

Des idées ?

13voto

Georgemayer Points 303

Un petit problème pour rails 4 : Les autres options de l'utilisateur doivent être autorisées dans les paramètres forts. antes de le paramètre d'entrée du fichier doit être correctement mis à jour en premier et accessible via l'Uploader.

4voto

Jonny Points 146

Vous pouvez stocker la valeur dans l'instance de modèle

puis, dans la méthode de traitement pour l'obtenir par l'attr du modèle

# model class
# define attr_accessor coords
class User < ActiveRecord::Base
  attr_accessor :coords
  mount_uploader :icon, AvatarUploader
end

# controller
# pass the params to @user.coords
def crop_icon
  @user.coords = params[:coords]
  @user.icon = params[:icon]
  @user.save
end

# Uploader
# the model in the function is same as @user in controll,
# and can be invoked inside of process method 
 def crop_area
    manipulate! do |img|
      unless model.coords.nil?
        coords = JSON.parse(model.coords)
        img.crop("#{coords['w']}x#{coords['h']}+#{coords['x']}+#{coords['y']}")
      end
      img = yield(img) if block_given?
      img
    end
  end

1voto

Aayush Points 115

J'ai eu le même problème. J'ai appelé directement la méthode store de l'Uploader, mais elle n'accepte qu'un seul paramètre, à savoir le fichier. J'avais également besoin de passer un identifiant pour stocker les fichiers dans un répertoire particulier. C'est ce que j'ai fini par faire et c'était assez simple :

J'ai défini la variable d'instance uploader comme et une méthode de classe pour définir la valeur.

class DocumentUploader < CarrierWave::Uploader::Base
    attr_accessor :cid

    def set_id id
        self.cid = id
    end
    ...
    def your_method
        my_id = self.cid
    end

end

Ensuite, dans l'action du contrôleur, j'ai fait ceci :

uploader = DocumentUploader.new
uploader.set_id(id)
uploader.store!(my_file)

0voto

Tomasz Wałkuski Points 590

Je creuse un peu pour trouver ça.

Vous pouvez passer des arguments comme suit

process do_stuff: ["foo", "bar"]

def do_stuff(arg_foo, arg_bar)
  arg_foo == "foo" # => true
  arg_bar == "bar" # => true
end

Selon moi, cela vaut mieux que de polluer le modèle avec des variables d'instance fictives.

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