Rails - 具有嵌套属性的简单表单

时间:2015-06-14 11:30:32

标签: ruby-on-rails psql

我正在尝试使用Rails 4和Simple Form制作应用程序。

我有三个模型,分别是:项目,范围和背景。

项目有一个范围。 范围有一个背景。 范围属于项目。 背景属于范围。 Project接受Scope的嵌套属性。 Scope接受背景的嵌套属性。

Project.rb:       has_one:范围       accepts_nested_attributes_for:scope

Scope.rb:

belongs_to :project
accepts_nested_attributes_for :background

Background.rb

  belongs_to :scope

项目控制器允许使用范围参数。此外,项目控制器内允许使用背景属性(作为范围属性)。

后台控制器也允许使用背景参数。

每个控制器中允许的参数包括相关的_id。

所以在:

  • 后台控制器,允许的参数包括:scope_id(不是:background_id)
    • 范围控制器,允许的参数包括:project_id

这是因为这些是属于另一个模型的那些模型的外键。

项目负责人:

def project_params
      params[:project].permit(
      :title, :project_id, scope_attributes: [:background, :project_id, background_attributes: [scope_id, title]])

范围控制器:

 def scope_params
    params[:scope].permit(:background, project_id, background_attributes: [scope_id, :title])

后台控制器:

params[:background].permit(:scope_id, :title)

我的麻烦在于理解为什么当我在一个实际上是背景属性的字段中编辑项目时,db记录会显示新id和新scope_id的创建?

例如,当我最初创建一个新项目时,Background表有ID 1和scope_id 4.当我编辑这个项目并返回查看psql数据库的Background表时,id变为2并且scope_id已成为5。

我期待这些ID保持原样,因为我只更新了记录(没有创建新记录)。

我错了预料到这一点?或者,我是否在我的控制器中将错误的id字段放入允许的参数中?或者,我错误地在每个项目,范围和背景控制器中为每个嵌套参数添加背景标记?

2 个答案:

答案 0 :(得分:0)

您的project_params应该是这样的

def project_params
   params.require(:project).permit(:id,:title, scope_attributes: [:id,:background, :project_id, background_attributes: [:id,scope_id, title]])
end

答案 1 :(得分:0)

听起来你实际上并没有编辑嵌套对象,而是每次都创建一个新对象。所以是的,您应该在表单的嵌套部分中包含id,并且还要在控制器中的require / permit设置的X_attributes部分中包含