2010-08-09 65 views
0

我有一個嵌套的資源形式(客戶端:鍛鍊的has_many),我想基於一些用戶輸入預填充(我用這個輸入設置了一些其它的默認參數新行動)。Ruby on Rails的 - 預填充新的記錄

<% form_tag new_client_workout_path(@workout_user) do%> 
    <%= date_select nil, :date %> 
    <%= submit_tag 'Enter New Workout' %><br/> 
<% end %> 

如果我提交此表單,我會得到以下錯誤。

ActionController::MethodNotAllowed Only get, put, and delete requests are allowed. 

我可以更新窗體的方法來獲取,它的工作原理,但是然後我在查詢字符串,我不想要的所有我的表單參數。

有沒有某種方式來完成這個使用職位?

我做過類似的東西時,沒有嵌套的資源和它工作得很好。

回答

1

所以,據我所知,想要的形式(如圖所示)被髮送作爲POST到控制器,該控制器使另一種形式被呈現,其是預先填入日期定向參數(從第一形式), 對?

這是非常規的,但你可以只是改變行動WorkoutsController所以接受一個POST而不是傳統的GET。第一種形式和行動(newcreate)如下 - 在routes.rb

map.resources :clients do |clients| 
    clients.resources :workouts, :new => { :new => :post } 
end 

UPDATE

乾淨RESTful的方式做這樣的事情是有一個單獨的控制器(ConfigWorkoutsContoller暫定名) ;

  • ConfigWorkoutsContoller#new呈現形式(如圖所示),其是GET
  • 其提交動作是POST到create動作與date
  • ConfigWorkoutsContoller#create預先填充@workout實例並呈現WorkoutsController#new
+0

是的,這正是我想要做的。在這種情況下,用戶正在遵循鍛鍊計劃,因此根據預先填寫他/她當天應該執行的練習的日期。出於這個原因,我需要提前知道日期,而只需在日期選擇器上進行新的鍛鍊。處理這種情況是否有更好的模式? – John 2010-08-09 18:13:25

+0

@John使用建議的更清晰的RESTful方法查看我的更新 – bjg 2010-08-09 20:47:12

0

我不知道如果這是直接關係到你的問題,但使用嵌套的資源的時候,你需要在兩個資源傳遞給你的表單標籤爲它生成正確的路線。意思是:

<% form_tag new_client_workout_path(@client, @workout) do %> 

我對所做的具體事情不夠了解,所以直接找到答案有點困難。什麼是@workout_user?你的路線是什麼樣的?

編輯:

下方看到您的回覆後,「更清潔的方式」來做到這一點是做:

<% form_tag(new_client_workout_path(@workout_user), :method => :get) do %> 

注:guides似乎使用帶引號的「獲取」,但我認爲一個符號也適用。

+0

你確定嗎?有了new_path我很確定你只需要@client資源(注意,我正在嘗試去NEW操作,而不是CREATE操作)。另外,@workout_user在這個實例中是@client,只是使用了一個非常規的變量名。 這條路線是 map.resources:clients,:has_many =>'訓練' – John 2010-08-09 16:06:21

+0

新的vs創建的好處,我沒有抓到。你對新的道路是正確的,你只需要提供客戶,但爲什麼你的形式指向新的道路?這聽起來像你需要添加':method =>:get'到你的表單標籤。 – theIV 2010-08-09 20:22:19

0

我能夠得到它通過添加一個隱藏的表單字段

<%= hidden_field_tag '_method', 'get' %> 

,這樣的形式方法是崗位工作,但其餘的方法就是讓

不知道如果我做所有這一切都是正確的方式,或者如果有更可接受的方式來獲取用戶對新動作的輸入。通常情況下,您會從新操作中獲得所有用戶輸入,但在這種情況下,我將根據用戶選擇的日期不同地構建表單。

+0

基於這個答案,我已經更新了我的答案。乾杯。 – theIV 2010-08-10 15:50:12