1

我有一个名为 App.Routine 的嵌套资源,它有很多活动。当我在这里发送帖子时是我的有效负载:

{例程:{name:testName,activities:[{name:testName},{name:testName}]}}

这将返回 500 错误:

例程控制器中的 ActiveRecord::AssociationTypeMismatch#create

Activity(#32627220) 预期,得到 ActiveSupport::HashWithIndifferentAccess(#33577656)

我的 Rails API 使用 ActiveModelSerializers:

class RoutineSerializer < ActiveModel::Serializer
  attributes :id, :name

  has_many :activities, embed: :ids
end

class RoutinesController < ApplicationController
  respond_to :json
  def create
    routine = Routine.create(params[:routine])
  end

我相信我的问题在于我如何处理我的routines_controller.rb 中的创建操作。Rails 不喜欢我如何在例程 JSON 中返回活动的哈希值,但我想不出正确的处理方法。

4

1 回答 1

0

我最初的问题确实出在我的 Rails API 上。我再次遵循@dgeb 的示例,并意识到我对强参数了解不多。值得庆幸的是,有一个Railscast!一旦我正确地实施了这一点,我就可以开始了!

在我的 Gemfile 中添加了“gem strong_parameters”。然后,我在父控制器上的#create 函数调用 update_parameters 函数,我首先在其中创建并保存父控制器,然后遍历子控制器并保存它。

来自 Dan Gebhart 的 ember 数据示例:

def permitted_params
  params.require(:contact).permit(:first_name,
                                :last_name,
                                :email,
                                :notes,
                                phone_numbers: [:id, :number])
end

def update_contact(contact)
  contact_params = permitted_params
  phone_numbers_param = contact_params.extract!(:phone_numbers)
  phone_numbers_param = phone_numbers_param[:phone_numbers]
  phone_numbers_param ||= []

  # Because updates to the contact and its associations should be atomic,
  # wrap them in a transaction.
  Contact.transaction do
    # Update the contact's own attributes first.
    contact.attributes = contact_params
    contact.save!

    # Update the contact's phone numbers, creating/destroying as appropriate.
    specified_phone_numbers = []
    phone_numbers_param.each do |phone_number_params|
      if phone_number_params[:id]
        pn = contact.phone_numbers.find(phone_number_params[:id])
        pn.update_attributes(phone_number_params)
      else
        pn = contact.phone_numbers.create(phone_number_params)
      end
      specified_phone_numbers << pn
    end
  contact.phone_numbers.each do |pn|
    pn.destroy unless specified_phone_numbers.include?(pn)
  end
  end

  # Important! Reload the contact to ensure that changes to its associations
  # (i.e. phone numbers) will be serialized correctly.
  contact.reload

  return true
  rescue
  return false
  end
于 2013-06-03T15:25:31.693 回答