0

如果我在浏览器中输入 URL,我会收到路由错误,但如果我单击指向该 URL 的链接,它就可以工作。为什么会这样?

  devise_for :user, :skip => [:registrations, :sessions] do 
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration 
    post 'signup/:invitation_token' => 'devise/registrations#create', :as => :user_registration 
    get 'signin' => 'devise/sessions#new', :as => :new_user_session 
    post 'signin' => 'devise/sessions#create', :as => :user_session 
    delete 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session
  end

例如,如果我在浏览器中输入 localhost:3000/signout,我会收到错误消息。但是如果有链接

<%= link_to "Logout", destroy_user_session_path, :method => :delete %>

它会起作用的。其他自定义路线也是如此。

4

2 回答 2

1

如果您阅读Devise 源代码,您会看到各种不同的 Devise 控制器操作由各种 HTTP 请求调用。

例如,新sign_in方法是一个GET请求:

# GET /resource/sign_in

但是新用户会话的实际创建是一个POST请求:

# POST /resource/sign_in

sign_out方法是一个DELETE请求:

# DELETE /resource/sign_out

在这三种请求类型(GETPOSTDELETE)中,只有GET通过在浏览器中键入 URL 即可发出请求——其他两种类型需要特定的 HTTP 标头,通常以表单、链接等形式设置。

访问每个 Devise 控制器方法必须进行的精确请求类型可作为源代码中的内联文档获得……我建议您看一下。

于 2013-09-03T00:28:53.200 回答
0

手动输入 URL 时会出现路由错误,因为 Web 浏览器默认发送 GET 请求。您的链接示例正在创建一个 DELETE 请求,按照:method => :delete。所以动词(GET vs DELETE vs PATCH vs POST)也必须匹配路由。您可以通过运行来查看专门为您的应用程序解释的内容rake routes。您将看到 URL 以及请求类型/动词。

如果您想发出类似的 DELETE 请求,您可以考虑使用 curl:http: //blogs.plexibus.com/2009/01/15/rest-esting-with-curl/

于 2013-09-03T00:20:48.240 回答