Rails.application.routes.recognize_path无法识别POST路由

时间:2016-04-25 23:12:32

标签: ruby-on-rails

我正在使用Rails.application.routes.recognize_path将路径分解为其组件--:controller,:action,:id等。它似乎与GET路由一起正常工作,但是对于POST路由,它会变空。这是我的路线文件的相关部分:

resources :units do
  member do
    get :test_get
    post :test_post
  end
end

以下是GET的recogn_path的输出:

Rails.application.routes.recognize_path '/units/1/test_get'
=> {:controller=>"units", :action=>"test_get", :id=>"1"}  

以下是POST的输出:

Rails.application.routes.recognize_path '/units/1/test_post'
ActionController::RoutingError: No route matches "/units/1/test_post"

定义路线 - 这是rake routes

的输出
test_get_unit GET     /units/:id/test_get(.:format)  units#test_get
test_post_unit POST   /units/:id/test_post(.:format) units#test_post

我的道路上缺少什么?我应该使用另一种方法吗?

2 个答案:

答案 0 :(得分:11)

让我放大这个答案。

我遇到了完全相同的问题。我有

swap!

在application_controller.rb中。这导致Rails 4做了

@controller_action_hash = Rails.application.routes.recognize_path(request.url)

(我正在使用Devise)。

这导致我走下兔子洞检查routes.rb,运行rake路线,并在Devise中搜索代码。

解决问题

在我的情况下,以下工作

ActionController::RoutingError (No route matches "http://localhost:3000/internal_users/sign_out"):

就我而言

@controller_action_hash = Rails.application.routes.recognize_path(request.url, method: request.env["REQUEST_METHOD"])

答案 1 :(得分:4)

发现它! recogn_path接受第二个参数,一个选项的哈希,其中一个是:方法。所以这有效:

Rails.application.routes.recognize_path '/units/1/test_post', method: :post
 => {:controller=>"units", :action=>"test_post", :id=>"1"}