【问题标题】:Nested Namespace Update Action No route matches [PATCH]嵌套命名空间更新操作没有路由匹配 [PATCH]
【发布时间】:2016-01-29 04:56:42
【问题描述】:

一直在尝试使用 namspacing 在 Rails 中取得进展,有类似的问题,我认为我的问题是所有内容都是命名空间的。

我尝试向模型添加一个类(之前使用带有嵌套对象的 devise 用户进行了此操作并且有效),但在处理命名空间时它似乎不起作用。

我收到路由错误。

 No route matches [PATCH] "/backend/membercontacts/1/memberlistings"

routes.rb

# Application Client Backend
namespace :backend do
    # Member Routes
    resources :membercontacts do
        resources :memberaddresses
        resources :memberlistings
    end
end

后端/memberlisting.rb

class Backend::Memberlisting < ActiveRecord::Base

    # Model Relationships
    belongs_to :membercontact

end

后端/membercontact.rb

class Backend::Membercontact < ActiveRecord::Base

    # Model Relationship
    has_many :memberlistings, dependent: :destroy

end

后端/memberlistings_controller.rb

class Backend::MemberlistingsController < ApplicationController

    # Security & Action Filters
    layout '/backend/application.html.erb'
    before_action :set_memberlisting, only: [:show, :edit, :update, :destroy]

    # Member Listing Index
    def index
        membercontact = Backend::Membercontact.find(params[:membercontact_id])
        @memberlistings = membercontact.memberlistings.order('mlcontactname ASC')
    end

    # Detailed Member Listing Profile
    def show
        membercontact = Backend::Membercontact.find(params[:membercontact_id])
        @membercontact = membercontact.memberlistings.find(params[:id])
    end

    # New Member Listing
    def new
        membercontact = Backend::Membercontact.find(params[:membercontact_id])
        @memberlisting = membercontact.memberlistings.build
        respond_to do |format|
            format.html # new.html.erb
            format.xml  { render :xml => @membercontact }
        end
    end

    # Edit Member Listing
    def edit
        membercontact = Backend::Membercontact.find(params[:membercontact_id])
        @memberlisting = membercontact.memberlistings.find(params[:id])
    end

    # Create Member Listing Action
    def create
        @membercontact = Backend::Membercontact.find(params[:membercontact_id])
        @memberlisting = @membercontact.memberlistings.create(memberlisting_params)
        respond_to do |format|
        if @memberlisting.save
            format.html { redirect_to backend_membercontact_memberlistings_path, notice: 'Address for Membercontact was Successfully Created.' }
            format.json { render action: 'show', status: :created, location: @memberlisting }
            else
                format.html { render action: 'new' }
                format.json { render json: @memberlisting.errors, status: :unprocessable_entity }
            end
        end
    end

    # Update Member Listing Action
    def update
        respond_to do |format|
        if @memberlisting.update(memberlisting_params)
            format.html { redirect_to backend_membercontact_memberlistings_path, notice: 'Address for Membercontact was Successfully Updated.' }
            format.json { head :no_content }
            else
                format.html { render action: 'edit' }
                format.json { render json: @memberlisting.errors, status: :unprocessable_entity }
            end
        end
    end

    # Delete Member Listing Action
    def destroy
        @membercontact = Backend::Membercontact.find(params[:membercontact_id])
        @memberlisting = @membercontact.memberlistings.find(params[:id])
        @memberlisting.destroy
        respond_to do |format|
            format.html { redirect_to backend_membercontact_memberlistings_path, notice: 'Address for Membercontact was Successfully Deleted.'  }
            format.json { head :no_content }
        end
    end

    private

    def set_memberlisting
        @memberlisting = Backend::Memberlisting.find(params[:id])
    end

    def memberlisting_params
        params.require(:backend_memberlisting).permit(:mlcontactname, :mlcompanyname, :mladdressline1, :mladdressline2, :mlcity, :mlprovince, :mlpostalcode, :mlphone, :mlwebsite, :mlemail, :membercontact_id, :account_id)
    end

end

路由耙

backend_membercontact_memberlistings_path       GET /backend/membercontacts/:membercontact_id/memberlistings(.:format)  backend/memberlistings#index
                                                POST    /backend/membercontacts/:membercontact_id/memberlistings(.:format)  backend/memberlistings#create
new_backend_membercontact_memberlisting_path    GET /backend/membercontacts/:membercontact_id/memberlistings/new(.:format)  backend/memberlistings#new
edit_backend_membercontact_memberlisting_path   GET /backend/membercontacts/:membercontact_id/memberlistings/:id/edit(.:format) backend/memberlistings#edit
backend_membercontact_memberlisting_path        GET /backend/membercontacts/:membercontact_id/memberlistings/:id(.:format)  backend/memberlistings#show
                                                PATCH   /backend/membercontacts/:membercontact_id/memberlistings/:id(.:format)  backend/memberlistings#update
                                                PUT /backend/membercontacts/:membercontact_id/memberlistings/:id(.:format)  backend/memberlistings#update
                                                DELETE  /backend/membercontacts/:membercontact_id/memberlistings/:id(.:format)  backend/memberlistings#destroy

到目前为止,我已经尝试使用模型文件中的类(仍在学习),并尝试了一些如下所示的变体。也是我定义url路径的原因,它默认为backend_membercontact_backend_memberlisting

, class_name: 'Backend::Memberlisting'
<%= form_for([@memberlisting.membercontact, @memberlisting], url: backend_membercontact_memberlistings_path, method: :post) do |f| %>

【问题讨论】:

  • 尝试将其更改为&lt;%= form_for([@memberlisting.membercontact, @memberlisting], url: backend_membercontact_memberlisting_path, method: :patch) do |f| %&gt;
  • 请稍等
  • 感谢工作。如果您可以将其复制到答案中,我可以给您信用。

标签: ruby-on-rails ruby-on-rails-4 routes nested-routes


【解决方案1】:

没有路线匹配 [PATCH] "/backend/membercontacts/1/memberlistings"

从您的rake routes 输出中,路径是backend_membercontact_memberlisting_path(没有s memberlisting)而不是backend_membercontact_memberlistings_path

另外,您应该将method: post 更改为method: :patch

<%= form_for([@memberlisting.membercontact, @memberlisting], url: backend_membercontact_memberlisting_path, method: :patch) do |f| %>

【讨论】:

    【解决方案2】:

    尝试使用

    <%= form_for([@memberlisting.membercontact, @memberlisting], url: backend_membercontact_memberlisting_path, method: :post) do |f| %>
    

    根据您的路线,您使用的backend_membercontact_memberlistings_path应该是backend_membercontact_memberlisting_path

    希望这行得通。

    【讨论】:

    • 上面的Pavan已经给出了解决方案。我确实相信我尝试过发布,它正在创造新的记录。我会再试一次,看看是不是这样,然后报告。但也感谢您的回答。
    • 不幸的是,这个没有工作。它说缺少帖子路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2014-09-27
    • 2015-03-19
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多