1

レール3.2.11、mongoid 3.0.18、carrierwave(0.7.1)、carrierwave-mongoid(0.3.0)を使用しています

2つのモデル:製品には多くのコンポーネントがあります。コンポーネントにはファイルフィールドがあります。製品ページに多くのコンポーネントフォームを追加するためにgemnested_formを使用しています。

class Product
  include Mongoid::Document
  include Mongoid::Timestamps

  field :title
  field :image

  embeds_many :components, cascade_callbacks: true
  accepts_nested_attributes_for :components, allow_destroy: true
end

class Component
  include Mongoid::Document
  include Mongoid::Timestamps
  field :title
  field :author
  field :file

  embedded_in :product

  mount_uploader :file, BaseFileUploader
end

コントローラ:

class ProductsController < BaseController

  def update
    resource = Product.find(params[:id])
    if resource.update_attributes(params[:product])      
      redirect_to collection_path
    else
      resource.components.build unless resource.components # there should be always one component
      render :edit
    end
  end
end

そして、ファイルフィールドのみを変更(!このフィールドにはすでに値があります)すると、dbへの保存クエリはありません。

しかし、私がコントローラーに強制保存を追加すると、

class ProductsController < BaseController

  def update
    resource = Product.find(params[:id])
    if resource.update_attributes(params[:product])
      resource.components.each do |component|
       component.save!
      end      
      redirect_to collection_path
    else
      resource.components.build unless resource.components # there should be always one component
      render :edit
    end
  end
end

そしてそれは動作します!ここに理由が何であるか知っていますか?

4

1 に答える 1

0

私もこの問題を見ています。埋め込みドキュメントのファイルだけでなく別のフィールドを更新すると、アップロードがトリガーされます。ファイルだけの場合は、何も起こりません。

于 2014-01-17T10:52:03.443 に答える