2015-11-01 40 views
0

我的form_for就是這樣開始的。form_for無法編輯/更新和顯示/新的一起工作?

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

我在編輯/更新時遇到了路由錯誤的問題。

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

通過另一個問題出現了與方法修復:修補加backend_membercontact_memberlisting(S)_path除去S和我可以更新的東西。

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

現在顯示/新的錯誤發生在以前沒有的地方。

No route matches {:action=>"show", :controller=>"backend/memberlistings", :membercontact_id=>"1"} missing required keys: [:id] 

我覺得把法補丁,結束時造成上述錯誤的,但我怎樣才能既顯示/新+編輯/更新工作?

一些額外的信息

的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_co ntroller.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 

我喜歡把一切都嵌套事情是這樣的。我無法弄清楚爲什麼crud功能會給我帶來麻煩,如果我拿出補丁方法,它不會更新,但是當我將補丁方法放入它時,不會創建新的或顯示缺少id的b/c記錄。

回答

1

您的form_for具有指定的URL選項,這意味着它始終使用records參數中提供的對象路由到該路徑。您列出的路徑與現有對象兼容,但與new對象不匹配,該對象尚未有ID

您也無法指定PATCH,因爲即使該方法不存在,它也會始終使用該PATCH。

您還需要包括在form_forrecords參數命名空間,所以它看起來相當接近如下:

<%= form_for([:backend, @memberlisting.membercontact, @memberlisting]) do |f| %>

把那一個鏡頭,看看它是否工作。你可以閱讀更多關於form_for幫手here

+0

謝謝。我想上次它一直在努力尋找。 backend_membercontact_backend_memberlistings雖然我會試一試。 – bradpotts

+0

嗯,riiiight。我想我現在想起來這件事有點毛。如果內存服務,我不得不在調用和新頁面中調用一個單獨的form_for,然後將表單元素包含爲部分。 –

+0

你認爲在路由文件中有一種方法可以從嵌套資源中刪除命名空間嗎?我可能也只是做範圍模塊:因爲我有一個更容易的時間。 – bradpotts