我很困惑如何最好地从带有角度前端的轨道中的相关模型更新数据(尽管这更像是一个轨道问题)。
假设我有一个名为votable的模型,其中包含一些属性(start_date,end_Date)和has_many文本(不同语言中可投票的描述)
class Votable < ActiveRecord::Base
has_many :votable_texts
accepts_nested_attributes_for :votable_texts
end
我的控制器中的show方法生成我在angular中使用的json数据来构建表单:
def show
respond_to do |format|
format.json {
render :json => @votable.to_json(
:except => [:created_at, :updated_at],
:include => {
:votable_texts => {
:except => [:created_at, :updated_at]
}
}
)
}
end
end
这会产生类似下面的json:
{
"id": 2,
"start_date": "2015-02-05T00:00:00.000Z",
"end_date": "2016-02-02T00:00:00.000Z",
"votable_texts": [
{
"id": 6,
"votable_id": 2,
"locale": "nl",
"issue": "Test"
},
{
"id": 2,
"votable_id": 2,
"locale": "en",
"issue": "Test"
}
]
}
在角度方面,我将此json读入变量并使用ng-model将此数据绑定到我的表单。当用户点击保存按钮时,我使用$ http.put将此数据发布回rails(与rails生成的json结构相同)。
问题是可投票模型的属性会更新(例如start_date),但嵌套的votable_texts模型中的属性不会更新。
控制器的相关部分如下所示:
def update
respond_to do |format|
if @votable.update(votable_params)
format.json { render :show, status: :ok, location: @votable }
else
format.json { render json: @votable.errors, status: :unprocessable_entity }
end
end
end
private
def votable_params
params.permit(:id, :start_date, :end_date, :votable_texts)
end
我错过了什么?我是否需要手动处理关联的更新?这怎么做得最好?
谢谢!
答案 0 :(得分:0)
我认为您的问题是因为您需要允许votable_texts
模型的嵌套参数。但是,当使用accepts_nested_attributes_for
和update
时,Rails会希望您传递voteable_texts_attributes
以便更新相关记录。在这种情况下,您将拥有以下内容。
params.permit(:id, :start_date, :end_date, votable_texts_attributes: [:id, :voteable_id, :locale, :issue])
因此,您可能需要更新show动作以使用voteable_texts_attributes
,否则您将不得不在行的某处更改param键。