【问题标题】:ActionController::RoutingError: No route matches [POST]ActionController::RoutingError: 没有路由匹配 [POST]
【发布时间】:2011-10-13 21:31:48
【问题描述】:
    require 'test_helper'

     class MyTest < ActionController::IntegrationTest

      test "view posts from login page" do
      visit("/logins/new")
      find_field('Username').set('abode')
      find_field('Password').set('efghi')
      click_link_or_button('Login')
      assert page.has_content?('Signed in!')
      end

      test "go to new user page" do
        visit("/logins/new")
        click_link("New user?")
        assert (current_path == "/users/new")
      end

    end

   Error:
test_view_posts_from_login_page(MyTest):
ActionController::RoutingError: No route matches [POST] "/logins/new"
    test/integration/view_posts_test.rb:12:in `block in <class:MyTest>'

第 12 行显示错误。“登录”按钮或 /logins/new 路径是否有问题?第二个测试通过了,所以路径应该是正确的?我做错了什么?

谢谢!

【问题讨论】:

    标签: ruby-on-rails integration-testing capybara actioncontroller


    【解决方案1】:

    真的很难说这里发生了什么。一般来说,如果您询问有关路由错误的问题,您也应该发布您的 routes.rb 文件中的内容。

    话虽如此,我认为为表单生成的任何 HTML 都指定了错误的操作。

    示例路线:

        tags GET    /tags(.:format)                {:action=>"index", :controller=>"tags"}
             POST   /tags(.:format)                {:action=>"create", :controller=>"tags"}
     new_tag GET    /tags/new(.:format)            {:action=>"new", :controller=>"tags"}
    edit_tag GET    /tags/:id/edit(.:format)       {:action=>"edit", :controller=>"tags"}
         tag GET    /tags/:id(.:format)            {:action=>"show", :controller=>"tags"}
             PUT    /tags/:id(.:format)            {:action=>"update", :controller=>"tags"}
             DELETE /tags/:id(.:format)            {:action=>"destroy", :controller=>"tags"}
    

    请注意那里的第二列中显示 POST 的位置。这意味着新对象表单的操作属性应设置为 /tags。有了它告诉 Rails 在标签控制器中呈现创建操作。您的登录模型也是如此。

    就表单 HTML 代码的实际外观而言,它可能看起来类似于:

    <form ... action="/logins/new" ...>...</form>
    

    应该是什么时候

    <form ... action="/logins" ...>...</form>
    

    希望这会有所帮助。

    【讨论】:

    • 是的,它有帮助。我意识到我的错误。添加了match '/logins/new', :controller =&gt; 'logins', :action =&gt; 'new' resources :logins,它现在可以工作了。谢谢!
    • 我不确定您为什么要在其中添加 match 语句? resources :logins 应该是你所需要的。
    【解决方案2】:

    我认为您的视图文件中的表单具有空白action-attribute,因此它将表单发布到/logins/new 而不是例如。 /logins 可能映射到您的 create-action。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-15
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多