没有匹配的路由[POST]-无法添加路由

时间:2018-09-25 07:06:30

标签: ruby-on-rails routes

我的方法无效。

我有一个游戏库,可以在其中添加,显示,编辑和销毁游戏。我想对其进行扩展,并向其添加另一种方法clone

使用rails g scaffold创建的库:

games_controller.rb中的克隆方法

def clone
  @game.clone

  respond_to do |format|
    format.html { redirect_to games_url, notice: 'Game was successfully cloned.'}
    format.json { head :no_content }
  end
end

索引中克隆的调用代码

<% @games.each do |game| %>
  <tr>
    <td><%= game.title %></td>
    <td><%= game.description %></td>
    <td><%= link_to 'Show', game %></td>
    <td><%= link_to 'Edit', edit_game_path(game) %></td>
    <td><%= link_to 'Destroy', game, method: :delete, data: { confirm: '.. sure?' } %></td>
    <td><%= link_to 'Clone', game, method: :clone, data: { confirm: '.. sure?' } %></td>
  </tr>
<% end %>

routes.rb中的路由代码

resources :games do
  resources :comments
  post 'clone'
end

a view in games library

1 个答案:

答案 0 :(得分:0)

您做错了。您有method: :clone无效link_tomethod选项的有效值为发布,修补,放置和删除

  

方法:HTTP动词的符号-此修饰符将动态创建一个   HTML表单,并立即使用   指定的HTTP动词。对于使链接执行POST操作很有用   采取危险操作,例如删除记录(搜索机器人可以   跟踪您的网站)。 支持的动词是:post,:delete,   :patch和:put 。请注意,如果用户禁用了JavaScript,则   请求将退回到使用GET。如果href:'#'被使用并且用户   已禁用JavaScript,则单击链接无效。如果你   依靠POST行为,您应该在自己的   通过使用请求对象的发布方法来执行控制器的操作?   删除?,修补?还是放置?。

现在进入您的路线,当您进行rake routes时,将看到以下内容

game_clone     POST   /games/:game_id/clone(.:format)     games#clone

因此,link_to应该如下所示

<%= link_to 'Clone', game_clone_path(game), method: :post, data: { confirm: '.. sure?' } %>
  

没有ID找不到游戏

好的,您正在克隆一个Game实例。通常,您会寻找一个带有:id的实例,但是使用您当前的路由,:game_id会传入params,这并不适合您的需要。您应该更改路线以通过:id而不是:game_id。所以最终的解决方案是

最终解决方案:

resources :games do
  resources :comments
  post 'clone', on: :member
end

上面的内容将与下面的内容一起创建路径帮助程序

clone_game POST   /games/:id/clone(.:format)    games#clone

现在使用新的路径助手更改link_to,您就可以开始了

<%= link_to 'Clone', clone_game_path(game), method: :post, data: { confirm: '.. sure?' } %>

注意:

在向资源丰富的路由添加自定义路由时,请务必小心。这将使用不必要的键(例如:*_id(在您的情况下为:game_id)创建路径助手。这些路由应根据情况添加为集合路由成员路由。有关更多信息,请参阅这些guides