2012-10-31 7 views
5

faseUtilizzare Carrierwave con un uno a molti relazione tra i modelli

Immagine un'applicazione galleria. Ho due modelli Handcraft e Photos. Uno artigianale può avere molte foto, supponiamo di avere modelli come questo:

  • Handcraft(name:string)
  • Photo(filename:string, description:string, ...)

In _form.html.erb di artigianato, c'è:

<%= form_for @handcraft, html: {multipart: true} do |f| %> 
    # ... other model fields 

    <div class="field"> 
    <%= f.label :photo %><br /> 
    <%= f.file_field :photo %> 
    </div> 

    # ... submit button 
<% end %> 

handcraft.rb assomiglia a questo:

class Handcraft < ActiveRecord::Base 
    attr_accessible :photo 
    has_many :photos 
    mount_uploader :photo, PhotoUploader 
    # ... 
end 

photo_uploader.rb:

class PhotoUploader < CarrierWave::Uploader::Base 

    include CarrierWave::RMagick 

    storage :file 

    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    version :thumb do 
    process :resize_to_limit => [100, 100] 
    end 

    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

Problema

Quando ho presentare il modulo, getta questo errore:

NoMethodError (undefined method `photo_will_change!' for #<Handcraft:0xb66de424>): 

Domanda

Come devo usare/configurare Carrierwave in questo caso?

risposta

11

è necessario montare l'uploader sul campo che memorizzerà il nome del file, in modo che i modelli dovrebbero assomigliare

class Handcraft < ActiveRecord::Base 
    attr_accessible :name 
    has_many :photos 
    # ... 
end 

class Photo < ActiveRecord::Base 
    attr_accessible :filename, :description 
    mount_uploader :filename, PhotoUploader 
    # ... 
end 

e poi come sembra sarete creare le foto tramite il modulo artigianale, è dovrebbe aggiungere

accepts_nested_attributes_for :photos 

nella classe Handcraft

Poi il modulo sarà simile

<%= form_for @handcraft, html: {multipart: true} do |f| %> 
    # ... other model fields 

    <%= f.fields_for :photos do |photo| %> 
    <%= photo.label :photo %><br /> 
    <%= photo.file_field :photo %> 
    <% end %> 

    # ... submit button 
<% end %> 

Per il modulo per visualizzare i campi per le macchine fotografiche, è necessario l'istanza Handcraft avere photos creato, questo può essere fatto nel metodo new nel HandcraftsController così:

def new 
    @handcraft = Handcraft.new 
    4.times { @handcraft.photos.build } 
end 

Questa volontà fai 4 campi (numero arbitrario) disponibili nel tuo modulo, se in qualche modo vuoi che l'utente aggiunga dinamicamente nuove foto nel tuo modulo, dai un'occhiata a nested_form