我的方法不起作用。
我有一个游戏库,我可以在其中添加、显示、编辑和销毁。我想扩展它并向其添加另一个方法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: :clone
。link_to
method
选项的有效值为发布、修补、放置和删除。
方法: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
(。这些路由应添加为收集路由或成员路由,具体取决于方案。有关更多信息,请参阅这些指南