我的方法无效。
我有一个游戏库,可以在其中添加,显示,编辑和销毁游戏。我想对其进行扩展,并向其添加另一种方法clone
。
使用rails g scaffold
创建的库:
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 %>
resources :games do
resources :comments
post 'clone'
end
答案 0 :(得分:0)
您做错了。您有method: :clone
,无效。 link_to
的method
选项的有效值为发布,修补,放置和删除。
方法: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