注销链接的路由问题?DELETE 与 GET 操作?

use*_*436 5 ruby ruby-on-rails ruby-on-rails-4

现在,我的注销链接的路由指向session#destroy,但它不是HTTP 删除动词,因此它不起作用。这个问题让我很沮丧,因为我应该能够自己解决这个问题,但到目前为止我还没有运气。这是我尝试注销时收到的错误消息:

没有路由匹配 [DELETE] "/logout"

这是我的路线文件:

Rails.application.routes.draw do



  get 'line_items/create'



  root 'static_pages#home'
  get 'testimonials' => 'static_pages#testimonials'
  get 'help' => 'static_pages#help'
  get 'about' => 'static_pages#about'
  get 'contact' => 'static_pages#contact'
  get 'signup' => 'users#new'
  get 'login' => 'sessions#new'
  get 'logout' => 'sessions#destroy'
  resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :products
  resources :categories
  resources :line_items
  resources :carts
 end
Run Code Online (Sandbox Code Playgroud)

会话控制器中的 destroy 方法:

def destroy
  forget(current_user)
  session.delete(:user_id)
  @current_user = nil
  redirect_to root_url
end
Run Code Online (Sandbox Code Playgroud)

注销链接:

          <li>
            <%= link_to "Log out", logout_path, method: "delete" %>
          </li>
Run Code Online (Sandbox Code Playgroud)

rake路线的相关结果:

logout_path     GET     /logout(.:format)   sessions#destroy
users_path  GET     /users(.:format)    users#index
POST    /users(.:format)    users#create
new_user_path   GET     /users/new(.:format)    users#new
edit_user_path  GET     /users/:id/edit(.:format)   users#edit
user_path   GET     /users/:id(.:format)    users#show
PATCH   /users/:id(.:format)    users#update
PUT     /users/:id(.:format)    users#update
DELETE  /users/:id(.:format)    users#destroy
sessions_path   POST    /sessions(.:format)     sessions#create
new_session_path    GET     /sessions/new(.:format)     sessions#new
session_path    DELETE  /sessions/:id(.:format)     sessions#destroy 
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

Sim*_*tti 4

您有两个选择:

  1. 更改链接以使用定义的路线

    <%= link_to "Log out", logout_path %>
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    <%= link_to "Log out", session_path, method: "delete" %>
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,为了使最后一个链接正常工作,您需要将其更改为单一资源(资源,而不是资源)。

    resource :sessions, only: [:new, :create, :destroy]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更改路线从

    get 'logout' => 'sessions#destroy'
    
    Run Code Online (Sandbox Code Playgroud)

    delete 'logout' => 'sessions#destroy'
    
    Run Code Online (Sandbox Code Playgroud)

无论如何,resources会话的复数形式没有意义。