我正在使用rails 3.2.8并且我遇到了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 :(得分: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
答案 1 :(得分: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知道如何处理记录的创建/更新,因此无需指定方法。
答案 2 :(得分: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 %>
答案 3 :(得分:0)
只是不要硬编码方法导致在不同的操作中使用相同的表单,并且您正在破坏Rails约定。
@object = MyModel.new
<%= form_for @object do |f| %>
如果您正在进行编辑操作
@object = MyModel.find(2)
<%= form_for @object do |f| %>
rails会关注方法。希望它有所帮助!