没有匹配的路由 [POST] - 添加路由不起作用



我的方法不起作用。

我有一个游戏库,我可以在其中添加、显示、编辑和销毁。我想扩展它并向其添加另一个方法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

游戏库中的视图

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

方法:HTTP 动词的符号 - 此修饰符将动态创建一个 HTML 表单,并立即提交表单以使用 指定的 HTTP 谓词。对于让链接执行 POST 操作很有用 在删除记录等危险操作中(搜索机器人可以 在抓取您的网站时跟随(。支持的动词是 :p ost、:d elete、 :p atch,:p ut。请注意,如果用户禁用了 JavaScript,则 请求将回退到使用 GET。如果使用 href:"#"并且用户 禁用 JavaScript 单击链接将不起作用。如果你 依赖于 POST 行为,您应该在 控制器使用请求对象的 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(。这些路由应添加为收集路由或成员路由,具体取决于方案。有关更多信息,请参阅这些指南

最新更新