使用关联数据发布JSON

Fre*_*red 2 rest json ruby-on-rails ruby-on-rails-3

我正在尝试向rails scaffold控制器发送POST请求,该控制器包含一个嵌套数组,表示需要创建并与新创建的父关联的记录.

以下是一些JSON示例:

{
    "plan_id":3,
    "weight":60,
    "exercise_sets": [
        {
            "created_at":"2012-06-13T14:55:57Z",
            "ended_at":"2012-06-13T14:55:57Z",
            "weight":"80.0",
            "repetitions":10,
            "exercise_id":1
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

..和我的模特..

class Session < ActiveRecord::Base
  has_many :exercise_sets, :dependent => :destroy
  has_many :exercises, :through => :exercise_sets
end

class ExerciseSet < ActiveRecord::Base
  belongs_to :exercise
  belongs_to :session
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试的是什么?

小智 5

这当然不是不可能的,尽管您可能需要稍微调整参数命名.

当您将上面的JSON传递给控制器​​时,它将作为参数传递给构造函数:

Session.new(params[:session])
Run Code Online (Sandbox Code Playgroud)

或者传递给持久化Session实例上的#update_attributes方法:

@session = Session.find(params[:id])
@session.update_attributes(params[:session])
Run Code Online (Sandbox Code Playgroud)

构造函数和#update_attributes方法都将"plan_id"之类的参数转换为assigment方法调用.那是,

@session.update_attributes(:plan_id => "1")  
Run Code Online (Sandbox Code Playgroud)

变成(#update_attributes方法内部):

@session.plan_id = "1"
Run Code Online (Sandbox Code Playgroud)

因此,这适用于您的plan_id和weight属性,因为您同时拥有#plan_id =和#weight = setter方法.你也有一个#exercise_sets =方法给你has_many :exercise_sets.但是,#exercise_sets =方法需要ExerciseSet对象,而不是ExerciseSet属性.

Rails能够通过#accepts_nested_attributes_for类方法执行您要执行的操作.试试这个:

class Session < ActiveRecord::Base
  has_many :exercise_sets, :dependent => :destroy
  has_many :exercises, :through => :exercise_sets

  accepts_nested_attributes_for :exercise_sets
end
Run Code Online (Sandbox Code Playgroud)

这为您设置(元程序)#exercise_sets_attributes =方法.所以只需将您的JSON修改为:

{
    "plan_id":3,
    "weight":60,
    "exercise_sets_attributes": [
        {
            "created_at":"2012-06-13T14:55:57Z",
            "ended_at":"2012-06-13T14:55:57Z",
            "weight":"80.0",
            "repetitions":10,
            "exercise_id":1
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

更多信息:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html