Один из способов сделать это - использовать вложенные маршруты :
rout.rb
resources :projects do
resources :stages
end
Это создаст маршруты примерно так:
project_stages GET /projects/:project_id/stages(.:format) stages#index
POST /projects/:project_id/stages(.:format) stages#create
new_project_stage GET /projects/:project_id/stages/new(.:format) stages#new
edit_project_stage GET /projects/:project_id/stages/:id/edit(.:format) stages#edit
project_stage GET /projects/:project_id/stages/:id(.:format) stages#show
PATCH /projects/:project_id/stages/:id(.:format) stages#update
PUT /projects/:project_id/stages/:id(.:format) stages#update
DELETE /projects/:project_id/stages/:id(.:format) stages#destroy
show. html .erb
<%= link_to "Add Stage", new_project_stage(@project), :class=>"button primary small" %>
stage_controller.rb
def create
@project = Project.find(params[:project_id])
@stage = @project.stages.build(stages_params)
@stage.save
end
Итак, мы добавили сюда вложенный ресурс, потому что этап принадлежит проекту. Таким образом, мы всегда получим проект, на котором мы добавляем этап, а не отправляем его вручную.