2013-08-01 34 views
0

我使用的鐵軌3.2.8和我有一個的form_for問題:的Rails的form_for使用錯誤的行動

我有不同的模型視圖中的格式如下:

<%= form_for pair, { :method => :put } do |f| %> 
    <td><%= pair.token.value %></td> 
    <td><%= pair.pair_token.value %></td> 
    <td><%= pair.freq %></td> 
    <td><%= pair.distance %></td> 
    <td><%= f.select :distance, [['', nil], ['Strongly Opposite', -3], ['Moderately Opposite', -2], ['Weakly Opposite', -1], 
           ['No Relationship', 0], ['Weakly Similar', 1], ['Moderately Similar', 2], ['Strongly Similar', 3]], {}, {} %></td> 
    <td><%= pair.agree %></td> 
    <td><%= f.select :agree, [['', nil],['True', 1], ['False', 0]], {}, {} %></td> 
    <td><%= f.submit %></td> 
<% end %> 

這種形式在名爲令牌的模型的視圖內。該頁面實際上是令牌show.html。我得到了響應:

No route matches [POST] "/pairs/269671" 

我不知道是怎麼回事錯了,因爲我要求的PUT動作和對對象試圖做一個職位。

謝謝

回答

0

你的路線文件是什麼樣的?

Rails有默認的HTTP動詞,它用於不同的動作。看到這裏: http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

創建通過POST發生,更新通過PUT發生。所以,你的路由需要同時支持,這是Rails在config/routes.rb中通過resources :pairs在後臺執行的操作。

如果您使用默認的Rails約定,則不需要覆蓋給定表單提交使用的HTTP動詞。

而且,如果你想進一步瞭解這些問題,看看這太問題: PUT vs POST in REST

0

嘗試了這一點

<%= form_for pair do |f| %> 
    <td><%= pair.token.value %></td> 
    <td><%= pair.pair_token.value %></td> 
    <td><%= pair.freq %></td> 
    <td><%= pair.distance %></td> 
    <td><%= f.select :distance, [['', nil], ['Strongly Opposite', -3], ['Moderately Opposite', -2], ['Weakly Opposite', -1], 
           ['No Relationship', 0], ['Weakly Similar', 1], ['Moderately Similar', 2], ['Strongly Similar', 3]], {}, {} %></td> 
    <td><%= pair.agree %></td> 
    <td><%= f.select :agree, [['', nil],['True', 1], ['False', 0]], {}, {} %></td> 
    <td><%= f.submit %></td> 
<% end %> 

的form_for知道如何處理創建的記錄/更新,所以不需要指定方法。

0

也許你需要在等形式的令牌:

<%= form_for [:tokens, pair] do |f| %> 
<td><%= pair.token.value %></td> 
<td><%= pair.pair_token.value %></td> 
<td><%= pair.freq %></td> 
<td><%= pair.distance %></td> 
<td><%= f.select :distance, [['', nil], ['Strongly Opposite', -3], ['Moderately Opposite', -2], ['Weakly Opposite', -1], 
          ['No Relationship', 0], ['Weakly Similar', 1], ['Moderately Similar', 2], ['Strongly Similar', 3]], {}, {} %></td> 
<td><%= pair.agree %></td> 
<td><%= f.select :agree, [['', nil],['True', 1], ['False', 0]], {}, {} %></td> 
<td><%= f.submit %></td> 
<% end %> 

所以你的路線將是:

[POST] /tokens/:token_id/pairs/:pair_id 

如果不行試試這個:

<%= form_for [@token, pair] do |f| %> 
<td><%= pair.token.value %></td> 
<td><%= pair.pair_token.value %></td> 
<td><%= pair.freq %></td> 
<td><%= pair.distance %></td> 
<td><%= f.select :distance, [['', nil], ['Strongly Opposite', -3], ['Moderately Opposite', -2], ['Weakly Opposite', -1], 
          ['No Relationship', 0], ['Weakly Similar', 1], ['Moderately Similar', 2], ['Strongly Similar', 3]], {}, {} %></td> 
<td><%= pair.agree %></td> 
<td><%= f.select :agree, [['', nil],['True', 1], ['False', 0]], {}, {} %></td> 
<td><%= f.submit %></td> 
<% end %> 
0

只是不要硬編碼的方法,因爲相同的形式正在不同的行動中使用,你打破了Rails約定。

@object = MyModel.new 
<%= form_for @object do |f| %> 

相同的,如果你在做編輯的動作

@object = MyModel.find(2) 
<%= form_for @object do |f| %> 

軌道約需方法照顧。希望能幫助到你 !