【问题标题】:Rails form_for using wrong actionRails form_for 使用错误的操作
【发布时间】:2013-08-01 16:13:20
【问题描述】:

我使用的是 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 操作,而 pair 对象正在尝试发布。

谢谢

【问题讨论】:

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


    【解决方案1】:

    您的路线文件是什么样的?

    Rails 具有用于不同操作的默认 HTTP 动词。看这里: http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

    通过 POST 创建,通过 PUT 进行更新。所以,你的路由需要同时支持这两者,这就是 Rails 在后台通过 config/routes.rb 中的resources :pairs 所做的。

    如果您使用默认的 Rails 约定,则不需要覆盖用于给定表单提交的 HTTP 动词。

    而且,如果您想进一步了解这些问题,请查看以下 SO 问题: PUT vs POST in REST

    【讨论】:

      【解决方案2】:

      试试这个

      <%= 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 知道如何处理记录的创建/更新,因此无需指定方法。

      【讨论】:

        【解决方案3】:

        也许您需要以如下形式包含令牌:

        <%= 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 %>
        

        【讨论】:

          【解决方案4】:

          不要对方法进行硬编码,因为在不同的操作中使用了相同的表单,并且您违反了 Rails 约定。

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

          如果您执行编辑操作则相同

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

          rails 会处理方法。希望对您有所帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多