我很难将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] })
非常感谢您指出我的缺陷。是的,我希望嵌套的成分资源成为到达此端点的有效负载的一部分。
答案 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" }
]
}
}
他们需要匹配。