Захват параметра ParentID во вложенных ресурсах

Я хотел бы зафиксировать параметр родительского идентификатора (внешний ключ) перед сохранением новой дочерней записи.

У меня есть две настройки как вложенные ресурсы в файле маршрутов, и ссылка на новое действие дочернего контроллера показывает правильно вложенный родительский идентификатор.

Когда я ввожу данные для ребенка и нажимаю «Создать», запись создается, однако я не могу зафиксировать идентификатор родителя.

Редактировать

Я использую модель вложенных наборов, чтобы связать таблицу с самой собой, чтобы столбца FK не было. Поскольку нет FK, мне нужно захватить родительский идентификатор перед сохранением записи и соответствующим образом обновить поля 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 route отображает следующее:

              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 %>

person Dercni    schedule 28.10.2014    source источник
comment
Пожалуйста, поделитесь своей формой, кодом контроллера и файлом маршрутов. :)   -  person Aaditi Jain    schedule 28.10.2014
comment
нет, не делайте эту оклейку. сделать суть. и публиковать только определенные части. чем длиннее ваш пост, тем больше задержка с ответом.   -  person argentum47    schedule 28.10.2014
comment
и чем меньше информации мы запрашиваем, но не получаем, тем меньше вероятность, что мы ответим.   -  person sevenseacat    schedule 28.10.2014
comment
Я относительно новичок здесь и не уверен, говорите ли вы мне публиковать меньше, публиковать больше или публиковать в другом формате или в другом месте?   -  person Dercni    schedule 28.10.2014
comment
@parent_id = params[:region_id] — это то, как вы получаете доступ к родительскому идентификатору.   -  person mohameddiaa27    schedule 29.10.2014


Ответы (1)


Вы должны использовать params[:region_id] в своем действии RegionsController, это должно получить parentId в вашем маршруте.

Поскольку это одни и те же действия для обоих маршрутов, вам также следует выполнить некоторые проверки, чтобы узнать, где вы находитесь в области действия.

Поэтому я бы предложил что-то вроде

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

person gbrennon    schedule 27.08.2019