Вложенные маршруты перенаправляются для создания действия с неправильным маршрутом

Я создал вложенные маршруты для модели 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: Вот мой код контроллера папки пользователя.

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: Это вывод консоли: Console


person Swaathi Kakarla    schedule 27.12.2014    source источник
comment
покажите нам свое действие создания, которое, по вашему мнению, ведет себя неправильно, или полный код контроллера   -  person Rustam A. Gasanov    schedule 27.12.2014
comment
Пожалуйста, добавьте свой код сюда. Это самостоятельная ассоциация? Кроме того, :userfolder_id будет преобразован в значение при создании связанной записи и не будет отображаться как в URL-адресе.   -  person jaspreet21anand    schedule 27.12.2014
comment
@RustamA.Gasanov Я добавил контроллер и код route.rb выше.   -  person Swaathi Kakarla    schedule 27.12.2014


Ответы (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.

person Swaathi Kakarla    schedule 28.12.2014