我有一个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,然后保存它,然后返回并编辑它,然后向case_type_field_set添加一个新的field_definition,它表示它保存没有错误,但是当我返回编辑时它,新添加的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,并且<<他们然后陷入最顶层的父母,这一切都有效。但是,如果您创建CaseType和CaseTypeFieldSet,保存CaseType,然后尝试向CaseTypeFieldSet添加新的FieldDefinition,然后保存父级,FieldSet将丢失。
答案 0 :(得分:0)
我很尴尬地说重新启动rails服务器修复了这个问题。