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