尝试创建POST请求但是没有路由匹配[GET]

时间:2011-08-18 23:19:57

标签: ruby-on-rails-3 http-post ruby-on-rails-3.1

我正在尝试做类似Railscasts #255的事情,但我收到了No Route错误:

在Ryan的routes.rb档案中:

    post "versions/:id/revert" => "versions#revert", :as => "revert_version"

在他使用路线的控制器中versions_controller.rb

    link = view_context.link_to(link_name, revert_version_path(@version.next, :redo => !params[:redo]), :method => :post)
    redirect_to :back, :notice => "Undid #{@version.event}. #{link}"

在我的routes.rb

    post "/approve/:id" => "listings#approve", :as => "listing_approve"

并查看我使用链接的位置:

    <%= link_to 'Approve Content', listing_approve_path(@listing), :method => :post %>

我的测试给我一个ActionController::RoutingError: No route matches [GET] "/approve/1"

如果我将方法保留为GET,一切正常..使用rails 3.1.0rc5。任何有关我在这里做错的指导都将非常感谢..

编辑:routes.rb文件(最后一行设置为match现在正常工作)

RLR::Application.routes.draw do

  root :to => "home#index"

  devise_for :users, :controllers => { :registrations => "registrations" }
  devise_for :users

  match '/user' => "layouts#index", :as => :user_root

  resources :users, :only => :show
  resources :layouts, :only => [:index, :show]
  resources :listings
  resources :features
  resources :orders

  match "/preview/:id" => "listings#preview", :as => "listing_preview", :via => "get"
  match "/approve/:id" => "listings#approve", :as => "listing_approve"

end

3 个答案:

答案 0 :(得分:1)

嗯,它看起来对我的眼睛是正确的。测试听起来像生成GET而不是POST,所以它可能是link_to调用的问题。你有:method =&gt; :发布那里,所以应该没事。 http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to似乎表明link_to将生成一些javascript以在点击时进行POST调用(并且禁用javascript的用户将获得正常的GET链接,除非您使用:href =“#”),因此可能是因为你的测试引擎没有运行javascript。

您可以通过将其更改为提交隐藏表单的按钮来解决此问题,但这可能不是您想要的直观表示。

答案 1 :(得分:0)

这可能是优先事项 - 使用routes.rb中的第一个匹配路由定义,因此如果您有资源路由或类似的东西,它可能首先匹配。

答案 2 :(得分:0)

我在我的rails应用程序中遇到了同样的问题,我通过做一个via来解决它问题:得到匹配而不是via :: post。我认为,出于某种原因,当您以/ something /:id格式发送请求时,它将自动承担其[GET]请求并搜索获取路由。这当然会导致您的路线出现问题,如果您将其作为:POST。

如果有人有更好的解决方案或想法,为什么你不能以'/ something /:id'格式发送帖子请求,请告诉我。