【问题标题】:Saving Object with embedded objects/documents in rails with mongoid使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象
【发布时间】: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'}]
}]
}

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 mongoid


    【解决方案1】:

    我认为你有几个问题。首先,您似乎正在尝试分配 JSON 的错误部分。 IE。您正在传递具有顶级 skabelon 属性的 JSON。这就是您可能想要分配给新 Skabelon 实例的内容。

    skabelon = Skabelon.new(skabelon_params[:skabelon])
    

    其次,您的 sektionerfelter 属性在 JSON 中命名错误。由于它们被标记为embeds_many,因此它们需要是复数形式:sektionersfelters

    【讨论】:

    • 您好,感谢您的帮助。看来您对我没有查看正确级别的 JSON 是正确的。现在我没有收到任何错误,但它只保存了顶级“Skabelon”并且所有嵌入的对象都没有保存在数据库中任何想法?
    • 我已经摆弄了一段时间,现在我卡住了:NoMethodError (undefined method `_association' for #<:parameters>
    • 您可以尝试直接指定强参数。例如params.permit(skabelon: [:title, sketioners: [felters: [:type, :text]]])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多