Загрузка изображения Carrierwave во вложенной форме все еще создает запись, даже если файл не указан - PullRequest
1 голос
/ 01 октября 2011

У меня есть загрузка изображения Carrierwave во вложенной форме simple_form, которая работает (вроде), если пользователь не указывает файл, и в этом случае создается пустой объект Picture, если ранее не было существующего. Не совсем уверен, как сделать так, чтобы, если пользователь не указал «новое» изображение для загрузки, старое не было удалено и / или была создана пустая запись без файла.

Одна (возможно, странная) вещь, которую я делаю, это всегда отправка зарегистрированного пользователя @user в действие user # edit, а затем создание @ user.picture, если он не существует. Я думаю, что здесь мой плохой дизайн.

    # user.rb
    class User < ActiveRecord::Base
    [...]

      has_one :picture, :dependent => :destroy
      accepts_nested_attributes_for :picture

    [...]
    end

    # picture.rb
    class Picture < ActiveRecord::Base
      attr_accessible :image, :remove_image
      belongs_to :user
      mount_uploader :image, ImageUploader
    end

    # users_controller.rb
    def edit
      if @user.picture.nil?
        @user.build_picture
      end
    end

    #_form.html.erb
    <%= simple_form_for @user, :html => {:multipart => true} do |f| %>
      <%= render "shared/error_messages", :target => @user %>  
      <h2>Picture</h2>
      <%= f.simple_fields_for :picture do |pic| %>
        <% if @user.picture.image? %>
          <%= image_tag @user.picture.image_url(:thumb).to_s %>     
          <%= pic.input :remove_image, :label => "Remove", :as => :boolean %>
        <% end %>
        <%= pic.input :image, :as => :file, :label => "Picture" %>
        <%= pic.input :image_cache, :as => :hidden %>
      <% end %>
      <br/>
    #rest of form here
    <% end %>

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Я думаю, что у меня была та же проблема, которую я решил, добавив опцию reject_if в accepts_nested_attribute. Итак, в вашем примере вы могли бы сделать что-то вроде

class User < ActiveRecord::Base
[...]

  has_one :picture, :dependent => :destroy
  accepts_nested_attributes_for :picture,
    :reject_if => lambda { |p| p.image.blank? }

[...]
end
0 голосов
/ 10 марта 2012

Сегодня у меня была такая же проблема, я решил это так:

  accepts_nested_attributes_for :photos,
    :reject_if => :all_blank
0 голосов
/ 09 ноября 2011

Когда вы используете build_ *, он устанавливает внешний ключ для объекта.(похоже на высказывание Picture.new (: user_id => id))

Попробуйте это

# users_controller.rb
def edit
  if @user.picture.nil?
    @user.picture = Picture.new
  end
end
...