【问题标题】:rails 3.2, how to write route for HTTP verb put, and use it in link_to?rails 3.2,如何为 HTTP 动词 put 编写路由,并在 link_to 中使用它?
【发布时间】:2012-06-01 04:09:21
【问题描述】:

我正在尝试为拒绝和批准操作编写两个链接, 但是,我不知道如何写正确的路线,

我的路线.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 路线中,我得到:

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'

p.s:我正在尝试让 link_to 使用 AJAX 工作,以便在同一页面中进行批准, 我走对了吗? link_to 路径是什么?

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails-3 routes


    【解决方案1】:

    首先,要清除错误需要使用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
    

    然后,要执行 PUT 请求,您需要在 link_to 调用中包含 :method 选项:

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

    如果您收到 404 导致 GET 请求而不是 PUT 请求,那是因为 :method => :put 选项依赖于 JavaScript。您需要确保 jquery-rails 已正确集成到您的应用中。

    【讨论】:

    • 谢谢马特,你能解释一下命名路线中的 (.:format) 部分吗?
    • 由于(.:format) 在括号中,它是路由的URL 字符串的可选部分。这 ”。”是静态的,而 ":format" 是实际选项。 Rails 默认格式为“html”,但是这允许您访问approve_class_room/5.xmlapprove_class_room/5.json 等,前提是您已将 Rails 应用程序配置为处理这些类型的格式。如果您对处理多种格式感兴趣,请查看 respond_torespond_with
    • 如果您不担心格式,您可以将路线的 URL 字符串保留为 'approve_class_room/:id' 和 'reject_class_room/:id' 而没有 '(.:format)' 部分.
    • 是的,我已经删除了格式,我只是添加了 :constraints => { :id => /\d+/ } 只接受数字...
    • 不确定,但您可能需要将 /\d+/ 更改为 /\A\d+\z/ 以匹配字符串的开头和结尾。不要引用我的话。否则字符串“hithere123foo”会通过,因为它包含数字,即使整个字符串不是数字。
    【解决方案2】:

    这可能无法清除该错误,但由于请求是 put,您需要在 link_to 中指定:

    = 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
    

    【讨论】:

    • 谢谢,比尔,虽然你的回答是正确的,但我一开始没有看到 ":as => :approve_class_room" 部分,只有当我滚动滚动条时,我希望我能将两个答案标记为正确,所以这是一个赞成票:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多