2013-06-05 4 views
1

J'ai une page de création de produit qui permet aux utilisateurs d'ajouter plusieurs images à un produit. Donc, naturellement, j'ai un certain nombre de champs de téléchargement d'images, cependant, lorsque le produit est créé, il ne prendra qu'une seule photo et l'ajouter à la base de données. Pas les autres. Je fais une erreur simple mais je n'ai aucune idée de quoi il s'agit.Rails - problème de téléchargement de plusieurs fichiers avec un formulaire_pour

Merci pour l'aide!

nouvelle forme de produit (de haml)

%h1 
    create item 
= form_for @product,:url => products_path, :html => { :multipart => true } do |f| 
    %p 
    = f.label :name 
    = f.text_field :name 
    %p 
    = f.label :description 
    = f.text_field :description 
    %p 
    = fields_for :photo, :html => {:multipart => true} do |fp| 
     =fp.file_field :image 
    %p 
    = fields_for :photo, :html => {:multipart => true} do |fp| 
     =fp.file_field :image 

    %p.button 
    = f.submit 

produits contrôleur

def new 
    @product = Product.new 
    @photo = Photo.new 
    end 


    def create 
    @product = current_user.products.build(params[:product]) 
    @photo = current_user.photos.new(params[:photo]) 

    if @product.valid? && @photo.valid? 
     @product.save 
     @photo.product_id = @product.id 
     @photo.save 
     render "show", :notice => "Sale created!" 
    else 
     render "new", :notice => "Somehting went wrong!" 
    end 
end 
+0

Utilisation des pierres précieuses comme un trombone pour télécharger des images. Et voir ma réponse ci-dessous. Cela peut vous aider. – Jyothu

+0

voir mon édition. "f.fields_for: photos". Avez-vous installé un trombone trombone? – Jyothu

+0

ouais je utilise un trombone gem –

Répondre

1

Vous essayez d'implémenter un formulaire d'attributs imbriqués. Donc, changer une partie fields_for à

%p 
    = f.fields_for :photos do |fp| 
    =fp.file_field :image 

changer ensuite votre nouvelle méthode dans le contrôleur

def new 
    @product = Product.new 
    3.times{ @product.photos.build } 
end 


def create 
    @product = current_user.products.new(params[:product]) 
    if @product.valid? 
    @product.save 
    render "show", :notice => "Sale created!" 
    else 
    render "new", :notice => "Something went wrong!" 
    end 
end 

vos modèles devraient être liés comme le

suivant
class Product 
    has_many :photos 
    accepts_nested_attributes_for :photos, allow_destroy: true 
end 

class Photo 
    attr_accessible :image 
    belongs_to :product 
end 

Si vous souhaitez mettre en œuvre un « Ajouter "bouton pour les photos, vous pouvez utiliser Gem nested_form. C'est très gentil.

+0

Intéressant j'ai ajouté tout ça mais ça n'a pas fonctionné ... hmnn –

+0

J'ai regardé cela à nouveau et l'ai implémenté et ça me donne 3 champs de téléchargement d'images même si j'en ai mis seulement un dans le html donc je suppose que ta réponse fonctionne jusque là. mais je reçois cette erreur Impossible d'assigner en masse des attributs protégés: photos_attributes .. ce qui est quelque chose que je n'ai jamais eu auparavant. Des idées? –

+1

Voir ma modification dans le modèle Photos. Nous devons spécifier attr_accessible pour le champ particulier. – Jyothu

1

Ici vous avez utilisé deux tag fields_for qui génèrent un élément de fichier d'entrée avec le même nom.

Ainsi, vous obtenez toujours un seul fichier sauvegardé car l'élément bot a le même nom et les paramètres dans les rails sont transmis en utilisant le nom de l'élément d'entrée. donc ici vous devez utiliser file_field_tag ​​et attraper les paramètres dans un contrôleur pour enregistrer dans une base de données.

+0

Comment pourrais-je faire à ce sujet. –

1

Vous pouvez utiliser le carrierwave Gem pour le serveur et vous pouvez utiliser plupload http://www.plupload.com/ pour l'avant, il est très simple

Questions connexes