JSON有效负载中嵌套资源的不允许参数

时间:2018-11-01 01:09:57

标签: ruby-on-rails ruby-on-rails-5 rails-api

我很难将JSON有效负载发送到包含嵌套资源的端点,该资源要完整创建并持久保留关联...无论我做什么,在控制台中都显示{{1} }。

models / meal.rb

Unpermitted parameter: :ingredients

models / ingredient.rb

class Meal < ApplicationRecord
  has_many :ingredients
  accepts_nested_attributes_for :ingredients
end

controller / meals_controller.rb

class Ingredient < ApplicationRecord
  belongs_to :meal
end

db / migrate / xxx_create_inredients.rb

class MealsController < ApplicationController
  def create
    @meal = Meal.new(meal_params)
    puts meal_params.inspect
    # just want to see the parameters in the log
    # ...
  end

  private
    def meal_params
      params.require(:meal).permit(
        :name,
        ingredients_attributes: [:id, :text]
      )
    end
  end

请求JSON有效负载

class CreateIngredients < ActiveRecord::Migration[5.1]
  def change
    create_table :ingredients do |t|
      t.belongs_to :meal, index: true
      t.string :text
      t.timestamps
    end
  end
end

我尝试了另一种方法from a SO article,遇到了类似的问题,该问题似乎可以识别成分参数,但最终抛出了500: { "meal": { "name": "My Favorite Meal", "ingredients": [ { "text": "First ingredient" }, { "text": "Second ingredient" } ] } }

这样做时,我收到以下信息: params.require(:meal).permit(:name, { ingredients: [:id, :text] })


非常感谢您指出我的缺陷。是的,我希望嵌套的成分资源成为到达此端点的有效负载的一部分。

1 个答案:

答案 0 :(得分:1)

这里唯一的问题是您的膳食参数中包含了elements_attributes

def meal_params
  params.require(:meal).permit(
    :name,
    ingredients_attributes: [:id, :text]
  )
end

因此在您的有效载荷中,您也需要使用该键

{
  "meal": {
    "name": "My Favorite Meal",
    "ingredients_attributes": [
      { "text": "First ingredient" },
      { "text": "Second ingredient" }
    ]
  }
}

他们需要匹配。