2015-06-12 56 views
0

如何在嵌套模型的属性中设置位置字段,以便我的has_many关系记住它的排序顺序?为嵌套模型属性设置索引位置值

我想从索引中设置位置,以便它反映关系被拖入的顺序。

我有一个嵌套字段的表单,使用jQuery Sortable的cocoon gem允许每个字段集都是可拖拽排序的。

我想更新保存表单的所有字段的顺序。

+0

哪两种模型类的在你们的关系中的名字呢? –

+0

@MaxWilliams - 简历和教育。简历has_many教育 – Will

回答

0

如果你设置了标准的CRUD /平稳路由和控制器动作,那么你所要做的就是在嵌套类的一个实例上调用“update_attributes(:position => 3)案件)。

通常的路线更新这是“恢复”下筑巢的教育将是

UPDATE /resumes/123/educations/456 

的话,你会作出一个AJAX调用这个网址。 “UPDATE”方法实际上不是一种更新方法,它通过传递参数"_method" = "UPDATE"进行欺骗,因此您的ajax调用也需要包含此参数。

所以,基本上,对“说完拖着”事件,你将要作出一个AJAX调用这个网址

"/resumes/<%= @resume.id %>/educations/<%= education.id %>" 

和传递数据,如

{"_method": "UPDATE", "education[position]": <new position>} 

这应该更新教育对象的位置。

剩下的另一个问题是,对于acts_as_list,当我们改变一个项目的位置时,我们希望其他人也自动调整它们的位置。我不确定acts_as_list是否会自动执行此操作。尝试一下。

+0

谢谢。我想设置保存表单的顺序。 – Will

+0

啊,当你说你正在使用jQuery排序时,我认为每当用户完成拖动项目时你都在做Ajax调用。 –

0

好的,非AJAX的版本。

让我们假设你的表单是一个form_for @resume,这意味着它将调用简历#创建或恢复#更新操作。

如果所有的education排在列表中有这样

<%= hidden_field_tag "resume[education_ids][]", education.id %> 

的隐藏字段,然后提交表单的时候,他们会经历到一个数组中PARAMS [:简历] [:education_ids] 按照表单提交的顺序在页面中显示,这正是你想要的。

该关联为您提供了setter方法Resume#education_ids,允许您按此顺序设置关联。

也就是说,你的更新动作会(如果它是一个正常的更新行动)是说像

@resume = Resume.find_by_id(params[:id]) 
if @resume.update_attributes(params[:resume]) 
    ... 
在这种情况下

,这将是说

@resume.update_attributes(:education_ids => [5,6,2,1]) 

这就好比说“设置我的教育是按照5,6,2,1的顺序排列的。

CAVEAT:在我的rails版本中(这可能会在后续版本中修复),如果你使用这个_ids方法,并且它已经有联系,但以不同的顺序,它不会重新排列它们。给它一个去看看会发生什么。

+0

谢谢@MaxWilliams - 表单可以添加和删除教育项目并对其进行重新排序。这就是为什么我需要从每个教育记录的位置来看每个教育记录的位置。它是索引。 – Will

+0

所以这是行不通的。我不知道所有记录的ID。实际上有些人没有保存身份证,因为他们是新的。 – Will

+0

你需要在你的问题中解释这个东西,即你的要求。我猜测是因为你没有给出你想要做什么的细节。 –

0

这不是最好的方法,但我已经在我的控制器中工作了。

p = 1 
experiences = [] 
params[:user][:resume_attributes][:experiences_attributes].each do |e|   
    e = e.last.merge(:position=>p) 
    experiences << e 
    p = p + 1 
end 
params[:user][:resume_attributes][:experiences_attributes] = experiences  

这至少说明了我想实现的目标。

+0

您能否将'params [:user]'的一些示例值复制到此答案中,以便我们可以看到这里发生了什么? –