使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象
Posted
技术标签:
【中文标题】使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象【英文标题】:Saving Object with embedded objects/documents in rails with mongoid 【发布时间】:2022-01-19 19:45:38 【问题描述】:所以我有一个新的 Rails 项目,我创建了一些我在下面列出的类。 我的问题是,当尝试在我的控制器中创建“Skabelon”时,它失败并显示“ArgumentError(参数数量错误(给定 2,预期 0..1))
我的控制器下面还有一个小例子,说明 json 数据是如何来自前端的。 附言。我必须使用 embedded_in 而不是 has_many 来做到这一点,因为我不希望所有这些都有自己的集合
Skabelon.rb
class Skabelon
include Mongoid::Document
store_in collection: 'skabeloner'
field :title, type: String
embeds_many :sektioner, class_name: "Sektion"
end
sektion.rb
class Sektion
include Mongoid::Document
field :title
embeds_many :felter, class_name: "SektionFelt"
embedded_in :skabelon
end
sektion_felt.rb
class SektionFelt
include Mongoid::Document
field :type
field :text
field :felter
embedded_in :sektion
end
然后我有以下控制器: 被调用的方法是从前端发送的 post 请求中“创建”
class SkabelonController < ApplicationController
# GET /skabeloner
def index
render json: Skabelon.all
end
# GET /skabeloner/1
def show
render json: Skabelon.find(params[:id])
end
# POST /skabeloner
def create
skabelon = Skabelon.new(skabelon_params)
skabelon.save
end
# PATCH/PUT /skabeloner/1
def update
end
# DELETE /skabeloner/1
def destroy
end
private
# Only allow a list of trusted parameters through.
def skabelon_params
params.permit!
end
end
从客户端到服务器的 JSON:
skabelon:
title: 'Oplysninger om barnet',
sektioner: [
felter: [type: 'text', text: 'Name']
]
【问题讨论】:
【参考方案1】:我认为你有几个问题。首先,您似乎正在尝试分配 JSON 的错误部分。 IE。您正在传递具有*** skabelon
属性的 JSON。这就是您可能想要分配给新 Skabelon 实例的内容。
skabelon = Skabelon.new(skabelon_params[:skabelon])
其次,您的 sektioner
和 felter
属性在 JSON 中命名错误。由于它们被标记为embeds_many
,因此它们需要是复数形式:sektioners
和 felters
。
【讨论】:
您好,感谢您的帮助。看来您对我没有查看正确级别的 JSON 是正确的。现在我没有收到任何错误,但它只保存了***“Skabelon”并且所有嵌入的对象都没有保存在数据库中任何想法? 我已经摆弄了一段时间,现在我卡住了:NoMethodError (undefined method `_association' for #<:parameters> 您可以尝试直接指定强参数。例如params.permit(skabelon: [:title, sketioners: [felters: [:type, :text]]])
以上是关于使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象的主要内容,如果未能解决你的问题,请参考以下文章