Скрепка, несколько вложений и проверка - PullRequest
6 голосов
/ 26 января 2011

У кого-нибудь есть в Rails 3 пример нескольких вложений, работающих с проверкой в ​​многочастной форме? Я пытался заставить это работать навсегда (и нашел каждое сообщение в блоге и сообщение, которое мог, но ни одно не покрывает эту ситуацию, и документы не помогают вообще).

Первая проблема в том, что в большинстве примеров используется 'new_record?' в шаблоне представления, но это всегда возвращает true в новой последовательности / последовательности создания, когда проверка завершается неудачно, потому что экземпляры модели не были сохранены (поэтому нет значения 'id'). Поэтому, если вы начнете с 5 экземпляров модели / входных файлов и загрузите один файл, теперь у вас будет 6 файловых входных данных, представленных при повторном рендеринге нового представления, и условие «разве» не выполнится по той же причине и не будут представлены эскизы.

Я хочу сохранить ссылку на загруженный файл (и я знаю, что это возможно - они живут во временном каталоге), одновременно представляя пользователю ошибки проверки для других обязательных полей.

У кого-то где-то должно быть это с Paperclip. ;)

Ответы [ 3 ]

4 голосов
/ 17 апреля 2011

Способ, которым я пользуюсь:

У меня есть свойства, в которых много фотографий (10 в случае).Переход к коду:

В контроллере свойств:

 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 = 10-@N      
        @N.times { @property.photos.build }
    else
        render :action => "show"
    end

  end

10.times "рендерит" 10 раз поле фотографии в поле зрения. При редактированииПриложу фото полей налево.Например: в первый раз я загрузил 3 фотографии, затем, если я хочу загрузить больше, появятся только 7 полей.


В модели свойств у меня есть:

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

Это позволяетфотографии для загрузки.


Фотомодель:

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>
2 голосов
/ 17 апреля 2011

Ответ, с которым я пошел, - это использовать несущую волну вместо скрепки. Мне потребовалось около часа, чтобы перерезать, и это решило эту проблему из коробки.

Вот мой ответ в другой ветке с гораздо более подробной информацией: Не теряется вложение скрепки, когда модель не может быть сохранена из-за ошибки проверки

1 голос
/ 19 марта 2011

Этого можно добиться, используя три модели и немного магии контроллера.

Первая модель - это модель, которую вы на самом деле хотите. Допустим, биография.

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

Теперь в вашем контроллере вы можете сделать что-то вроде этого:

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
...