2011-01-26 20 views
6

Herhangi biri çok parçalı formda doğrulama ile çalışan birden çok ekin Rails 3 örneğine sahip midir? Bu çalışmayı sonsuza kadar sürdürmeye çalışıyorum (ve her blog gönderisini ve mesajımı bulabildim, fakat hiçbiri bu durumu kapsamıyor ve dokümanlar hiç yardımcı değil).Ataş, çoklu ataşmanlar ve doğrulamalar

İlk sorun, çoğu örnekte 'new_record?' görünüm şablonunda, ancak model örnekleri kaydedilmediğinden (yani 'id' değeri yok), doğrulama başarısız olduğunda bu her zaman yeni/oluşturma sırasına döner. Dolayısıyla, 5 model örnek/dosya girişi ile başlar ve bir dosya yüklerseniz, şimdi yeni görünümü yeniden oluşturduğunuzda 6 dosya girişi sunulur ve aynı nedenle "iptal" ifadesi başarısız olur ve küçük resimler sunulmaz.

Yüklenen dosyaya giden bağlantıyı korumak istiyorum (ve bunun mümkün olduğunu biliyorum - geçici bir dizinde yaşıyorlar) ve diğer gerekli alanlar için doğrulama hatalarını kullanıcıya sunarken.

Buralarda birileri Paperclip ile çalışmalıdır. ;)

+0

, hiç bir şey buldunuz? Teşekkürler. –

+0

Paperclip için hiçbir şey, en azından tam çözüm değil (doğrulama olmadan çoklu eklenti desteği http://www.emersonlackey.com/article/rails-paperclip-multiple-file-uploads adresinde görülebilir). Bir süre önce Sinatra uygulaması için benzer bir şeyi kodladım ve doğru bir şekilde almak için uzun zaman aldı. Şu anda kullanıcılar için bu desteği sunmuyorum (formumdaki diğer alanlar için doğrulama başarısız olursa yeniden yüklemeleri gerekir). Bence bu, "% 80" çözümlerini kullanırken sorun yaratıyor - uzatmaktan sıfırdan kodlamak daha kolay. –

cevap

1

Bunu üç model ve biraz denetleyici büyüsü kullanarak gerçekleştirebilirsiniz.

İlk model, gerçekten istediğiniz modeldir. Biyografi diyelim.

class Biography < ActiveRecord::Base 
    has_one :biography_fields 
    has_many :biography_attachments 
end 

class BiographyFields < ActiveRecord::Base 
    belongs_to :biography 

    # Validations 
end 

class BiographyAttachment < ActiveRecord::Base 
    belongs_to :biography 

    # Paperclip stuff 
end 

Şimdi controller içerisinde böyle bir şey yapabilirsiniz:

class BiographiesController 

    def some_method 
    @biography = Biography.find(params[:biography_id]) || Biography.create! 

    if @biography.biography_data.create(params[:biography_data]) 
     # Try to save the uploads, if it all works, redirect. 
    else 
     # Still try the uploads, if they work, save them and make sure to pass the :biography_id as a hidden field so they can be used without re-uploading. Also reflect this in the form. 
    end 
    end 

end 
4

yolu kullanıyorum:

Ben fazla fotoğraf var olduğu özelliklere sahip (10 durumunda). özellikleri kontrolörü olarak

: var whe koduna gitmek

def new 
    @search = Property.search(params[:search]) 
    @property = Property.new 
    10.times { @property.photos.build }  

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @property } 
    end 
    end 

    # GET /properties/1/edit 
    def edit 
    @search = Property.search(params[:search]) 
    @property = Property.find(params[:id]) 

    # Se o usuário atual for dono da propriedade 
    if current_user.id == @property.user_id 
     @photos = Photo.where("property_id = ?", @property.id) 
     @N = @photos.count 
     @N = [email protected]  
     @N.times { @property.photos.build } 
    else 
     render :action => "show" 
    end 

    end 

10.times görünümünde 10 kez fotoğraf alanını "render". Form düzenlendiğinde, yalnızca fotoğraf alanlarını görüntüleme izni verilir. Örnek için: İlk kez 3 fotoğraf yükledim, daha fazla yüklemek istersem, sadece 7 alan görünür. mülkiyet modelinde


Ben:

class Property < ActiveRecord::Base 
    attr_accessible :photos_attributes, :logradouro, :complemento, :wc, :negocio, :cep, :vagas, :valor, 
    :quartos, :uf, :area, :bairro, :suites, :salas, :numero, :cidade, :descricao, 
    :status, :tipoImovel 
    has_many :photos 
    accepts_nested_attributes_for :photos, :allow_destroy => true 

end 

Bu fotoğraflar yüklenmesine izin verir.


Fotoğraf modeli: Kısmi Benim formda

class Photo < ActiveRecord::Base 
    belongs_to :property  

    has_attached_file :photo, :styles => { :small => "100x100>", :medium => "530>x530", :large => "800x800>" } 
    validates_attachment_presence :photo 
    validates_attachment_size :photo, :less_than => 500.kilobytes 
end 

:

<div id="new_up">    
      <%= f.fields_for :photos do |p| %> 
       <% if p.object.new_record? %> 
        <p><%= p.file_field :photo %> 
         <%= p.radio_button :miniatura, true -%> 
        </p> 
        <% end %> 
      <% end %> 
      </div> 

     <div id="old_up"> 
      <h4>Imagens Atuais</h4> 
      <% f.fields_for :photos do |p| %> 
       <% unless p.object.new_record? %> 
        <div style="float: left;"> 
         <%= p.radio_button :miniatura, true -%> 
         <%= link_to image_tag(p.object.photo.url(:small)), p.object.photo.url(:original) %> 
         <%= p.check_box :_destroy %>    
        </div> 
       <% end %> 
      <% end %> 
     </div> 
İlgili konular