一个评估项目具有许多项目级别,其中一个项目级别属于一个评估项目。在我的模型中,我有
has_many :item_levels
accepts_nested_attributes_for :item_levels
更新项目时,您应该能够指定应与该项目关联的级别。更新操作应接收为级别指定的参数,并创建与要更新的 Item 关联的新 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
这是我在邮递员中的 json 请求:
{
"assessment_item": {
"slug" : "newSlug",
"description" : "NewDescriptiong",
"name" : "different name",
"item_level_attributes":[
{
"descriptor":"this should be new",
"level":"excellent"
}
]}
}
如何使我的操作允许参数?如何有效地将它们传递到工厂?谢谢。
我认为您还应该允许像这样update_params
item_level_attributes
:
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