Перенаправление вложенных маршрутов для создания действий с неверным маршрутом
Я создал вложенные маршруты для модели под названием Userfolder. Маршруты отображаются следующим образом:
userfolder_userfolders POST /userfolders/:userfolder_id/userfolders(.:format) userfolders#create
new_userfolder_userfolder GET /userfolders/:userfolder_id/userfolders/new(.:format) userfolders#new
Что именно так, как я хочу. Но когда я создаю новую папку пользователя, Rails перенаправляет действие создания на "/userfolders", а не на "/userfolders/:userfolder_id/userfolders". Это все еще следует за начальными маршрутами лесов Rails.
Есть ли способ изменить это? Или я что-то упустил полностью?
РЕДАКТИРОВАТЬ 1: Вот мой код контроллера Userfolder.
class UserfoldersController < ApplicationController
before_action :set_userfolder, only: [:show, :edit, :update, :destroy]
before_action :set_parentfolder, except: [:show, :edit, :update, :destroy, :index]
# GET /userfolders
# GET /userfolders.json
def index
if Userfolder.first.nil?
Userfolder.create(:name => 'root', :parent_id => 0)
end
redirect_to Userfolder.first
end
# GET /userfolders/1
# GET /userfolders/1.json
def show
end
# GET /userfolders/:userfolder_id/userfolders/new(.:format)
def new
@userfolder = @parentfolder.children.build
end
# GET /userfolders/1/edit
def edit
end
# POST /userfolders/:userfolder_id/userfolders
def create
@userfolder = @parentfolder.children.build(userfolder_params)
respond_to do |format|
if @userfolder.save
format.html { redirect_to userfolder_path(@parentfolder.id), notice: 'Userfolder was successfully created.' }
else
render :action => 'new'
end
end
end
# PATCH/PUT /userfolders/1
# PATCH/PUT /userfolders/1.json
def update
respond_to do |format|
if @userfolder.update(userfolder_params)
format.html { redirect_to @userfolder, notice: 'Userfolder was successfully updated.' }
else
render :action => 'edit'
end
end
end
# DELETE /userfolders/1
# DELETE /userfolders/1.json
def destroy
parent_folder = @userfolder.parent
@userfolder.destroy
respond_to do |format|
format.html { redirect_to parent_folder, notice: 'Userfolder was successfully destroyed.' }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_userfolder
@userfolder = Userfolder.find(params[:id])
end
def set_parentfolder
@parentfolder = Userfolder.find(params[:userfolder_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def userfolder_params
params.require(:userfolder).permit(:name, :parent_id)
end
end
Это мой файл route.rb:
Rails.application.routes.draw do
resources :userfiles
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes".
# You can have the root of your site routed with "root"
root 'userfolders#index'
resources :userfolders, :shallow => true, :except => [:new, :create] do
resources :userfolders, :only => [:new, :create]
end
РЕДАКТИРОВАТЬ 2: Это вывод консоли:
1 ответ
Так что проблема была с _form.html.erb, как я и подозревал.
Это контроллер создания:
def create
@userfolder = @parentfolder.children.build(userfolder_params)
respond_to do |format|
if @userfolder.save
format.html { redirect_to @parentfolder, notice: 'Userfolder was successfully created.' }
else
render :action => 'new'
end
end
end
А вот _form.html.erb:
<%= form_for([@parentfolder, @userfolder]) do |f| %>
<% if @userfolder.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@userfolder.errors.count, "error") %> prohibited this userfolder from being saved:</h2>
<ul>
<% @userfolder.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :parent_id %><br>
<%= f.number_field :parent_id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Добавляя <%= form_for([@parentfolder, @userfolder]) do |f| %>
Я говорю Rails для перенаправления в /userfolders/:userfolder_id/userfolders. Вместо перенаправления в / userfolders.