2015-07-12 56 views
0

我正在開發一個Ruby on Rails應用程序。它有一個嵌套的路線,像這樣:Rails form_for錯誤|如何將嵌套的ActiveRecord對象綁定到表格

Rails.application.routes.draw do 
    root 'trip_plans#index' 
    resources :trip_plans do 
    resources :places, except: [:show, :index] 
    end 
end 

trip_plans資源具有TripPlan模型和places資源具有Place模型。根據路線,new_trip_plan_place_path是類似於/trip_plans/:trip_plan_id/places/new的路線。該views/places/new.html.haml使用form_for聲明當前trip_plan中創建一個新的地方:

- content_for :title do 
    %title Add a Place to Your Plan 

%header.form-header 
    .container.form-container 
    .row 
     .col-xs-12 
     %h1 Add a Place 
     %hr 

%article 
    %section 
    .container.form-container 
     = render 'form' 

相應edit.html.haml基本上是一樣的,調用同一個_form.html.haml呈現形式。

places_controller的兩個newedit動作是這樣的:

def new 
    @trip_plan = TripPlan.find(params[:trip_plan_id]) 
    @place = @trip_plan.places.build 
end 

def edit 
    @trip_plan = TripPlan.find(params[:trip_plan_id]) 
    @place = @trip_plan.places.build 
end 

_form.html.haml使用@place像這樣:

= form_for @place do |f| 

但作爲@place是從屬的ActiveRecord對象,Rails是無法找出newedit路徑的正確網址。即使在edit頁面上,它也會顯示新的表格。

我該如何解決這個問題?

在此先感謝!

+0

嘗試改變這一行'@place = @ trip_plan.places.build'到在'edit'方法中'@place = Place.find(params [:id])'' – Pavan

回答

1

它總是顯示即使在編輯頁面

一種新的形式我想這個問題是此行@place = @trip_plan.places.buildedit方法。

@place = @trip_plan.places.build不過@place = @trip_plan.places.new,所以Rails的對待@place新實例甚至編輯表單

更改爲@place = Place.find(params[:id])應該可以解決您的問題。

更新:

你也應該更改如下

= form_for @place do |f| 

的到

= form_for [@trip_plan, @place] do |f| 
+0

真棒Pavan,它的作品。但編輯表單的「action」仍然設置爲「new_trip_plan_place_path」,例如'/ trip_plans/1/place'。 –

+0

@AbraarArique我沒有明白。你的行動意味着什麼仍然被設置爲'new_trip_plan_place_path'。你將如何編輯表單?通過鏈接? – Pavan

+0

我的意思是新的地方表單應該通過POST將數據提交給'/ trip_plans /:trip_plan_id/places',編輯表單應該通過PATCH/PUT請求提交給'/ trip_plans /:trip_plan_id/places /:id'。但是當我訪問表單頁面(新建或編輯)時,它出錯了「未定義的方法'places_path'」。 –