2009-01-04 3 views
1

J'ai un modèle, Chose, qui a un has_many avec ThingPhoto, en utilisant Paperclip pour tout gérer. Dans la vue "show" pour Thing, je veux télécharger un fichier et le faire correspondre au modèle Thing.Ajouter une photo au modèle has_many d'un modèle à partir d'une vue

Pour une raison quelconque, je suis totalement glitching sur la façon dont cela devrait être fait. Je l'ai essayé de le faire (Haml):

- form_for @thing.thing_photos, :html => {:multipart => true} do |f| 
    = f.file_field :photo 
    = f.submit 

... et je reçois cette erreur:

undefined method `array_path' for #<ActionView::Base:0x24d42b4> 

Google me manque. Je suis sûr que c'est super facile, mais je n'arrive pas à comprendre mon cerveau. Editer: J'aurais dû mentionner que si je change le @ thing.thing_photos juste @thing, cela fonctionne très bien, en ce sens qu'il affiche le formulaire, mais bien sûr il n'est pas associé au bon modèle.

Répondre

1

essayer @thing.thing_photos.new

cette instance si un nouveau modèle de thing_photos. Si vous n'utilisez pas de routes imbriquées, vous devez ajouter le thing_id comme champ masqué.

0

Si vous n'êtes pas lié à Paperclip (et si vous faites juste des images), j'ai eu un lot de la chance avec fleximage. Il a une très bonne documentation pour le téléchargement d'images, la manipulation et l'affichage (avec toutes sortes d'effets nets comme le filigrane et autres).

Il ne répond pas tout à fait à votre question, mais c'est peut-être une bonne chose à examiner.

Mais je parie que votre problème lié au fait que vous créez un formulaire pour un tableau d'objets (grâce à une association). Je parie que quelque chose est de trouver le type de l'objet (devrait être "thing_photo" mais est "array" dans votre exemple), et d'y ajouter "path" pour écrire l'URL du formulaire. Peut-être que vous devriez ajouter un .first ou créer un partiel?

0

Le formulaire doit être pour @thing_photo et doit passer soit dans le thing_id ou si elle est une route imbriquée vous pouvez l'obtenir de cette

puis dans votre contrôleur thing_photos

@thing_photo = Photo.new(params[:thing_photo]) 
#if using nested route 
@thing = Thing.find(params[:thing_id]) 

#if using hidden field 
@thing = Thing.find(params[:thing_photo][:thing_id]) 

if @thing_photo.save 
    #this is what ties the thing photo to the thing 
    @thing.thing_photos << @thing_photo 
end 

Si je comprends question correctement, cela pourrait aider.

Questions connexes