【发布时间】:2016-08-18 10:30:07
【问题描述】:
我有一个具有以下关系的 Rails / Mongoid 应用程序:
class CaseType
include Mongoid::Document
embeds_many :case_type_field_sets
accepts_nested_attributes_for :case_type_field_sets, :reject_if => lambda { |a| a[:description].blank? }, :allow_destroy => true
field :description, type: String
end
class CaseTypeFieldSet
include Mongoid::Document
embeds_many :field_definitions
embedded_in :case_type
field :description, type: String
accepts_nested_attributes_for :field_definitions, :reject_if => lambda { |a| a[:description].blank? }, :allow_destroy => true
end
class FieldDefinition
include Mongoid::Document
field :description, type: String # what we use to render the UI
embedded_in :case_type_field_set
end
所有这些都使用 case_types_controller 进行更新,并且允许所有参数:
def case_type_params
params.require(:case_type).permit(:description,
:case_type_field_sets, case_type_field_sets_attributes:
[:id, :description, :_destroy, field_definitions_attributes:
[:id, :description, :_destroy]])
end
如果我创建一个新的case_type,然后向它添加一个新的case_type_field_set,然后向case_type_field_set 添加一个新的field_definition,这一切都在一个动作中,它工作正常。但是,如果我创建一个新的case_type,然后添加一个新的case_type_field_set,然后保存它,然后返回并编辑它,然后将一个新的field_definition 添加到case_type_field_set,它说它保存没有错误,但是当我回去编辑它,新添加的 field_set 丢失了。服务器日志中没有提到错误:
Started PATCH "/case_types/57b479f4a4610006beba7254" for ::1 at 2016-08-17 13:21:45 -0400
Processing by CaseTypesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xJnbp9gr8yyDamRZItfBPUDDX4qSoOQ/XIbGM0D8urW6UAYGuM5FIT1w8jLaBhSnEC7PF/KMAxfB6+HGCYoAiA==", "case_type"=>{"description"=>"case type 1", "case_type_field_sets_attributes"=>{"0"=>{"_destroy"=>"false", "description"=>"asdf", "field_definitions_attributes"=>{"1471454502151"=>{"_destroy"=>"false", "description"=>"new fd 3"}}, "id"=>"57b49c24a4610006beba725c"}}}, "commit"=>"Update Case type", "id"=>"57b479f4a4610006beba7254"}
MONGODB | localhost:27017 | opencaseware_development.find | STARTED | {"find"=>"case_types", "filter"=>{"_id"=>BSON::ObjectId('57b479f4a4610006beba7254')}}
MONGODB | localhost:27017 | opencaseware_development.find | SUCCEEDED | 0.0009080000000000001s
0.000413s
Redirected to http://localhost:3000/case_types
Completed 302 Found in 12ms
关于为什么新的嵌套创建工作但更新失败的任何想法?
更新,我注意到当调用原始创建时,它会触发 mongo 插入,但是当我使用新嵌入更新现有记录时,它不会触发插入,以防万一这有帮助。
更新 - 我很确定问题完全是由模型引起的。在控制台中,您可以轻松地重现这一点,如果您创建一个 CaseType、一个 CaseTypeFieldSet 和一个 FieldDefinition,然后
【问题讨论】:
标签: ruby-on-rails mongodb mongoid