AssessmentItem有许多ItemLevels,一个ItemLevel属于AssessmentItem。 在我的模型中我有
has_many :item_levels
accepts_nested_attributes_for :item_levels
更新项目时,您应该能够指定与该项目关联的级别。更新操作应接收为级别指定的参数,并创建与正在更新的项目关联的新ItemLevel对象,并删除我们先前关联且未在更新时指定的任何级别。但是,当我尝试创建新级别时,出现ActiveModel::ForbiddenAttributes
错误。
控制器:
def update
@item = AssessmentItem.find(params[:id])
old_levels = @item.item_levels #active record collection
@item.update_attributes(update_params)
convert_levels = old_levels.map {|l| l.attributes} #puts into array
(items - convert_levels).each{|l| ItemLevel.create(l)} ##causes error
(convert_levels - level_params).each { |l| ItemLevel.find(l["id"]).destroy }
end
end
private
def level_params
params.require(:assessment_item).permit(:item_levels => [:descriptor, :level])
end
def update_params
params.require(:assessment_item).permit(:slug, :description, :name)
end
这是我在Postman的json请求:
{
"assessment_item": {
"slug" : "newSlug",
"description" : "NewDescriptiong",
"name" : "different name",
"item_level_attributes":[
{
"descriptor":"this should be new",
"level":"excellent"
}
]}
}
如何让我的动作允许参数?我怎样才能有效地将它们传递给工厂?感谢。
答案 0 :(得分:0)
我认为您还应该允许item_level_attributes
中的update_params
这样:
def update_params
params.require(:assessment_item).permit(:slug, :description, :name, :item_levels => [:descriptor, :level])
end
或
def update_params
params.require(:assessment_item).permit(:slug, :description, :name, :item_level_attributes => [:descriptor, :level])
end