使用错误的操作Rails form_for

时间:2013-08-01 16:13:21

标签: ruby-on-rails-3 routing put form-for controllers

我正在使用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操作并且对象试图发布帖子。

由于

4 个答案:

答案 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会关注方法。希望它有所帮助!