【问题标题】:Why does rails give me an error when I try to use match in routes?当我尝试在路线中使用 match 时,为什么 rails 会给我一个错误?
【发布时间】:2013-10-15 23:02:19
【问题描述】:

所以我的路线中有这条线。rb match 'calculate' => 'index#calculate' 在尝试加载索引页面时它给了我一个错误:

你不应该在你的路由器中使用match 方法 指定 HTTP 方法。如果您想向两者公开您的操作 GET 和 POST,添加via: [:get, :post] 选项。如果你想暴露 您对 GET 的操作,在路由器中使用 get:而不是:匹配 “controller#action” 做:得到“controller#action”

基本上,它是一个简单的应用程序,它从表单中获取一个数字,然后在对其进行一些计算后将其打印出来。但我现在被这个错误困住了......

我该如何克服这个错误?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    要克服此错误,请将您的 match 语句替换为 get 语句

    Replace:
    
    match 'calculate' => 'index#calculate'
    
    With:
    
    get 'calculate' => 'index#calculate'
    

    Rails 建议您使用 get 而不是更通用的 match 的原因是通过迫使您做出有意识的 api 设计决策来提高安全性。 GET 请求与 POST 请求不同。 POST 表示“改变”;该请求改变了一些东西,它修改了系统。 GET 的意思是“给这个页面”。它不会改变任何东西。

    我假设您的端点返回某种计算的结果。您可能会争辩说,由于计算不会改变任何内容,因此 GET 请求是可行的方法。您还可以争辩说,此端点不会总是为相同的输入返回相同的值(也许?),在这种情况下,您可能想说这是一个 POST,因为您没有获得唯一的资源。

    我相信这是您正在制作的测试应用。根据您希望将学习重点放在 Rails 的哪个方面,您可能想要选择一个,同时实现两者并看看有什么变化,或者只是抛硬币 :)

    match 方法过去以您使用它的方式工作,但自从 rails 4 以来,这已更改为需要这种明确性。

    文档:http://guides.rubyonrails.org/routing.html#http-verb-constraints

    【讨论】:

    • 感谢您的帮助。我会尝试从这里开始工作:)
    【解决方案2】:

    您正在寻找:

    match 'calculate', :to => 'index#calculate'
    

    这将创建 GET 和 POST 路由。除非您两者都需要,否则无需使用“匹配”。您尝试做的可能只需要一条 GET 路线:

    get 'calculate' => 'index#calculate'
    

    【讨论】:

      【解决方案3】:

      此错误在 Rails 4 中引发,因为如果不小心使用 match 会为跨站点脚本 (XSS) 开辟一条路线。从您的描述中很难判断您实际需要哪些路由,但如果您正在提交表单,您很可能只需要一个用于初始加载表单的 get 路由和一个 post 路由作为发送表单数据的位置.

      要修复此错误,只需按照错误消息给出的说明进行操作,然后使用:

      match 'calculate' => 'index#calculate', via: [:get, :post]
      

      get 'calculate' => 'index#calculate'
      

      取决于您需要的路线。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 2021-05-26
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多