Ruby on Rails:仅在键入浏览器时出现路由错误,但在单击链接时有效吗?

时间:2013-09-02 23:38:00

标签: ruby-on-rails ruby devise ruby-on-rails-3.2

如果'我在浏览器中输入了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 %>

它会起作用。其他定制路线也是如此。

2 个答案:

答案 0 :(得分:1)

如果您阅读Devise source code,您将看到各种HTTP请求调用各种Devise控制器操作。

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

# GET /resource/sign_in

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

# POST /resource/sign_in

sign_out方法是DELETE请求:

# DELETE /resource/sign_out

在这三种请求类型(GETPOSTDELETE)中,只需在浏览器中输入网址即可生成GET次请求两种类型需要特定的HTTP标头通常在表单,链接等中设置。

the source code中的内联文档提供了访问每个Devise控制器方法所必需的精确请求类型...我建议你看看。

答案 1 :(得分:0)

手动输入URL时出现路由错误,因为Web浏览器默认发送GET请求。您的链接示例是根据:method => :delete创建DELETE请求。所以动词(GET vs DELETE vs PATCH vs POST)也必须匹配路线。您可以通过运行rake routes专门为您的应用看到此说明。您将看到网址以及请求类型/动词。

如果您想提出类似的DELETE请求,可以使用curl进行调查:http://blogs.plexibus.com/2009/01/15/rest-esting-with-curl/