如何转到 Rails 中的注销路径?

how to go to logout path in rails?

提问人:Afaq Khan 提问时间:10/19/2023 更新时间:10/19/2023 访问量:59

问:

我正在使用 rails 7,当我单击注销时,它显示一个错误,即找不到注销路径。 这是我的 routes.rb、会话控制器和注销标头部分的代码:

Rails.application.routes.draw do
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  root 'pages#home'
  get 'about', to: 'pages#about'
  resources :articles
  get "/signup", to: "users#new"
  resources :users, except: [:new]
  get "/login", to: "sessions#new"
  post "/login", to: "sessions#create"
  delete '/logout', to: 'sessions#destroy'

end




<li class="nav-item">
            <%= link_to "Log out", logout_path, method: :delete, class: "nav-link" %>
   </li>



 def destroy
    session[:user_id] = nil
    flash[:notice] = "Logged out"
    redirect_to root_path

  end

error message(please note that i have already added ujs)

Ruby-on-Rails 错误处理 RubyGems Rails-Routing

评论

0赞 Afaq Khan 10/19/2023
@dbugger它仍然显示该错误:(
0赞 max 10/19/2023
@dbugger只是一个提醒 - 该链接质量非常低。此更改与 Turbo 流无关。相反,Turbo 对它绑定事件处理程序的所有数据属性使用“命名空间”以避免潜在的冲突。

答:

3赞 Alicia Paz 10/19/2023 #1

您的链接正在发送 GET 请求,但它应该是 DELETE。这是因为 Rails 7 默认带有 Turbo。尝试:

<%= link_to "Log out", logout_path, data: {turbo_method: :delete} %>
1赞 max 10/19/2023 #2

使用 button_to 而不是 。这将创建一个实际的表单元素,而不是依赖于 JavaScript。link_to

<%= button_to "Log out", 
              logout_path, 
              method: :delete, 
              class: "nav-link" %>

对于关键功能,例如应该“正常工作”的注销,建议这样做。

如果出于某种原因,您实际上需要一个发送非 GET 请求的链接,那么 Turbo 会将其事件处理程序附加到 data-turbo-method,而不是 Rails UJS 使用的:data-method

<%= link_to "Log out", 
             logout_path, 
             data: { turbo_method: :delete }, 
             class: "nav-link" %>

您今天想要这样做的唯一真正原因是,如果您想在执行非 GET 请求的表单元素中添加链接。这是因为 HTML 中不允许嵌套表单。

请注意,为了使其正常工作,Turbo 必须出现在页面上并正常工作,这可能会因多种原因而失败,具体取决于应用程序中的资产管道。