使用带有自定义to_param的routes.rb中的嵌套资源,强参数如何允许创建/更新允许?

时间:2015-06-27 12:59:14

标签: ruby-on-rails exception strong-parameters nested-resources

我找不到能引导正确方向的东西。其他所有与嵌套资源类似的问题似乎都在accepts_nested_attributes_for左右解决......我不想这样做。我不是想拯救父母的孩子,我正试图直接从孩子身上拯救。

在我的routes.rb中,我嵌套了我的资源

resources :parents, param: :parent do
  resources :children, param: :child
end

parentchild表都有自己的id列,但也分别在列parentchild上有唯一索引,我是用于URL而不是id

  

http://example.com/parents/parent/children/child

这可以很好地浏览每个控制器的showeditindex操作。

问题是保存数据有例外。

我希望问题的根本原因不会归结为child表中的字段,也称为child,因为这是我用来覆盖的{{1}在模型中,需要保持这种方式。

导航到编辑屏幕:http://example.com/parents/harry/children/sally/edit并在表单上按提交,返回此 NoMethodError 例外:

  

/ parents / harry / children / sally的NoMethodError   未定义的方法`permit'for“sally”:String

我确定问题与我的强参数行在to_param中的方式有​​关。我可以向children_controller.rb添加require:parent的哈希吗?

:child

更新1(已添加参数):以下是请求参数:

def children_params
  params.require(:child).permit(:child, :date_of_birth, :nickname)
end

错误时的其他实例变量范围:

@parent

{
  "utf8"=>"✓", 
  "_method"=>"patch", 
  "authenticity_token"=>"fAkBvy1pboi8TvwYh8sPDJ6n2wynbHexm/MidHruYos7AqwlKO/09kvBGyWAwbe+sy7+PFAIqKwPouIaE34usg==", 
  "child"=>"sally", 
  "commit"=>"Update Child", 
  "controller"=>"children", 
  "action"=>"update", 
  "parent_parent"=>"harry"
}

@child

<Parent id: 1, parent: "harry", description: "", user_id: 1, created_at: "2015-06-27 12:00:15", updated_at: "2015-06-27 12:00:15">

2 个答案:

答案 0 :(得分:1)

params ,您需要更改children_params,如下所示

def children_params
  params.permit(:child, :date_of_birth, :nickname) 
end

答案 1 :(得分:0)

事实证明,问题确实似乎是因为模型属性在模型中被命名为相同,这也是params散列也被称为(真正的问题似乎在于)

我需要做的就是重命名params hash。

children_controller.rb,我不得不改变:

def children_params
  params.require(:child).permit(:child, :date_of_birth, :nickname)
end

为...

def children_params
  params.require(:anything_else).permit(:child, :date_of_birth, :nickname)
end

然后还从以下位置更改新/编辑视图中的form_for表单:

<%= simple_form_for([@parent, @child]) do |f| %>

为...

<%= simple_form_for([@parent, @child], as: :child_params) do |f| %>

现在,在两个测试中以及用户通过用户界面正常使用网站时,所有方法都能全面运作。