レール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
そしてそれは動作します!ここに理由が何であるか知っていますか?