rails 3.2,如何为HTTP动词put编写路由,并在link_to中使用它?

14 浏览
0 Comments

rails 3.2,如何为HTTP动词put编写路由,并在link_to中使用它?

我正在尝试编写两个链接用于拒绝和批准操作,但是我不知道如何编写正确的路由。我的route.rb文件如下:

put 'approve_class_room/:id(.:format)', :to => 'class_room_member_ships#approve'
put 'reject_class_room/:id(.:format)', :to => 'class_room_member_ships#reject'

但是,在rake routes中,我得到了以下结果:

PUT /approve_class_room/:id(.:format) class_room_member_ships#approve

PUT /reject_class_room/:id(.:format) class_room_member_ships#reject

那么,正确的link_to路径是什么?

我的链接是:

= link_to 'approve', approve_class_room_path

但是它不起作用,我得到了以下错误:

undefined local variable or method `approve_class_room_path'

附:我正在尝试使用AJAX使链接在同一页面上工作,我走对了吗?正确的link_to路径是什么?

请给予任何建议。

0
0 Comments

问题的原因是,使用link_to方法时,如果想要执行PUT请求,需要在link_to方法中添加:method选项。解决方法是使用named routes,并在link_to方法中添加:method选项。

首先,使用named routes来清除错误:

put 'approve_class_room/:id(.:format)', :to => 'class_room_member_ships#approve',
                                        :as => :approve_class_room
put 'reject_class_room/:id(.:format)', :to => 'class_room_member_ships#reject',
                                       :as => :reject_class_room

然后,在link_to方法中添加:method选项来执行PUT请求:

link_to 'approve', approve_class_room_path, :method => :put
link_to 'reject', reject_class_room_path, :method => :put

如果你收到一个404错误,而不是一个PUT请求,那是因为:method => :put选项依赖于JavaScript。你需要确保jquery-rails在你的应用程序中正确集成。

关于named routes中的(.:format)部分的解释是,括号中的部分是URL字符串的可选部分。"."是固定的,而":format"是实际的选项。Rails默认的format是"html",但是这允许你访问approve_class_room/5.xml、approve_class_room/5.json等,前提是你已经配置了你的Rails应用程序来处理这些类型的格式。如果你对处理多种格式感兴趣,可以查看respond_to和respond_with。

如果你不关心格式,可以将路由的URL字符串简化为'approve_class_room/:id'和'reject_class_room/:id',不包含'(.:format)'部分。

关于正则表达式,你可能需要将/\d+/更改为/\A\d+\z/来匹配字符串的开头和结尾。否则,字符串"hithere123foo"会被匹配,因为它包含数字,即使整个字符串不是数字。

关于\A和\z的解释,可以参考这个答案和它附带的链接到Ruby文档。

0
0 Comments

问题的原因是在使用link_to时没有指定HTTP动词为put。解决方法是在link_to中添加:method => :put,并且在路由中添加:as => :approve_class_room

具体代码如下:

= link_to 'approve', approve_class_room_path, :method => :put
put 'approve_class_room/:id(.:format)', :to => 'class_room_member_ships#approve', :as => :approve_class_room

感谢Bill的回答,虽然你的答案是正确的,但我一开始没有注意到":as => :approve_class_room"这部分,只有当我滚动滚动条时才看到。希望我可以将两个答案都标记为正确,所以这里给你点赞。

0