2012-10-31 30 views
5

StageZastosowanie Carrierwave z jednego do wielu relacji między modelami

Obraz aplikacja galeria. Mam dwa modele Handcraft i Photos. Jeden rzemieślnicze mogą mieć wiele zdjęć załóżmy, że mam modele tak:

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

W _form.html.erb z rękodziełem, znajduje się:

<%= 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 wygląda tak:

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 

Problem

Kiedy przesłać formularz, zgłasza ten błąd:

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

Pytanie

Jak powinienem użyć/skonfigurować Carrierwave w tym przypadku?

Odpowiedz

11

Trzeba zamontować uploader na polu, które będą przechowywać nazwę pliku, dzięki czemu modele powinny wyglądać

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

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

a następnie, jak się wydaje będziesz tworzenie zdjęć za pomocą formularza rzemieślnicze, ty należy dodać

accepts_nested_attributes_for :photos 

w swojej klasie Handcraft

Wtedy twoja postać będzie wyglądać następująco

<%= 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 %> 

dla formularza, aby wyświetlić pola dla zdjęcie, musisz instancji Handcraft mieć photos utworzony, można to zrobić w sposób new w HandcraftsController tak:

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

Ta wola udostępnić 4 pola (liczba arbitralna) w formularzu, jeśli chcesz, aby użytkownik dynamicznie dodawał nowe zdjęcia do formularza, spójrz na: nested_form