【问题标题】:Nested routes redirecting to create action with wrong route嵌套路由重定向以创建具有错误路由的操作
【发布时间】:2015-02-24 12:20:24
【问题描述】:

我为一个名为 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

这是我的 routes.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: 这是控制台输出:

【问题讨论】:

  • 向我们展示您认为行为不正确的创建操作或完整的控制器代码
  • 请在此处添加您的代码。是自加入协会吗?如果创建关联记录, :userfolder_id 也将转换为一个值,并且不会按原样显示在 url 中。
  • @RustamA.Gasanov 我已经添加了控制器和上面的 routes.rb 代码。

标签: ruby-on-rails ruby url-routing nested-routes


【解决方案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 %>

通过添加&lt;%= form_for([@parentfolder, @userfolder]) do |f| %&gt;,我告诉Rails 重定向到/userfolders/:userfolder_id/userfolders。而不是重定向到 /userfolders。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多