使用邮递员

时间:2016-07-18 02:37:13

标签: ruby-on-rails nested-attributes strong-parameters

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"
            }
            ]}
}

如何让我的动作允许参数?我怎样才能有效地将它们传递给工厂?感谢。

1 个答案:

答案 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