在嵌套资源中捕获ParentID参数

时间:2014-10-28 07:10:24

标签: ruby-on-rails activerecord nested-routes

我想在保存新的子记录之前捕获父Id param(外键)。

我将两个设置作为路径文件中的嵌套资源,并且指向新子控制器操作的链接显示正确嵌套的父ID。

当我输入孩子的数据并单击“创建”时,会创建记录但是我无法捕获父母的ID。

修改

我使用嵌套集模型将表关联回自身,因此没有FK列。因为没有FK我需要在保存记录之前捕获父ID并更新另一个记录的lft&相应的rgt字段。

http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

路线:

Rails.application.routes.draw do
  resources :regions do
    resources :regions
  end
End

新表格

区域列表包含以下用于创建新子区域的链接:

stackoverflow不允许我发布表单字段但是我认为我的问题在于表单是在嵌套资源之前发布到@region的,这是来自脚手架。

rake路线显示以下内容:

              Prefix Verb   URI Pattern                                    Controller#Action
      region_regions GET    /regions/:region_id/regions(.:format)          regions#index
                     POST   /regions/:region_id/regions(.:format)          regions#create
   new_region_region GET    /regions/:region_id/regions/new(.:format)      regions#new
  edit_region_region GET    /regions/:region_id/regions/:id/edit(.:format) regions#edit
       region_region GET    /regions/:region_id/regions/:id(.:format)      regions#show
                     PATCH  /regions/:region_id/regions/:id(.:format)      regions#update
                     PUT    /regions/:region_id/regions/:id(.:format)      regions#update
                     DELETE /regions/:region_id/regions/:id(.:format)      regions#destroy
             regions GET    /regions(.:format)                             regions#index
                     POST   /regions(.:format)                             regions#create
          new_region GET    /regions/new(.:format)                         regions#new
         edit_region GET    /regions/:id/edit(.:format)                    regions#edit
              region GET    /regions/:id(.:format)                         regions#show
                     PATCH  /regions/:id(.:format)                         regions#update
                     PUT    /regions/:id(.:format)                         regions#update
                     DELETE /regions/:id(.:format)                         regions#destroy


<%= form_for(@region) do |f| %>
...
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

1 个答案:

答案 0 :(得分:0)

您应该在RegionsController动作中使用params[:region_id],这应该在您的路线中获取parentId。

由于这两种路线的操作相同,因此您还应该进行一些检查以了解您在范围内的位置。

所以我建议类似

class RegionController < ApplicationController def create if params[:region_id] parent = Region.find(params[:region_id]) # ... end ... end end