无法找到id为sign_out的用户。

24 浏览
0 Comments

无法找到id为sign_out的用户。

我的rails应用中的退出链接无法工作。

我已经检查了我的routes.rb文件,如下所示,我的application.html.erb看起来是正确的路径。

得到以下错误。

ActiveRecord::RecordNotFound in UsersController#show
找不到id=sign_out的用户
Rails根目录:/Users/patrickwalsh/rails_projects/ytutorial
应用程序跟踪 | 框架跟踪 | 完整跟踪
app/controllers/users_controller.rb:4:in 'show'
lib/disable_assets_logger.rb:11:in 'call'

我的routes.rb

Refectory::Application.routes.draw do

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

devise_scope :user do

get 'login', to: "devise/sessions#new", as: "login"

get 'logout', to: "devise/sessions#destroy", as: "logout"

get 'logout', to: "users/sessions#destroy", as: "logout"

get 'signup', to: "users#new", as: "signup"

match '/users/:id', :to => 'users#show', :as => :user

end

root :to => 'tutorials#index'

devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy'

get 'users/:id' => 'users#show'

end

resources :tutorials

resources :comments, only: [:show, :create, :update, :destroy]

resources :tutorials do

member { post :vote }

end

if Rails.env == "development"

match 'errors/404' => 'errors#error_404'

match 'errors/500' => 'errors#error_500'

end

unless Rails.application.config.consider_all_requests_local

match '*not_found', to: 'errors#error_404'

end

match 'tagged' => 'tutorials#tagged', :as => 'tagged'

end

以及我可以看到的application.html似乎是正确的路径。

非常感谢任何帮助!

<% if current_user.present? %>
          
  • <%= link_to "退出", destroy_user_session_path, (:method => "delete") %>
  • <% else %>
  • <%= link_to "登录", new_user_session_path %>
  • <%= link_to "注册", new_user_registration_path %>
  • <% end %>

    我的用户控制器也有问题,我怀疑问题出在这里,但不确定错误是什么。

    class UsersController < Devise::RegistrationsController
    def show
      @user = User.find(params[:id])
      @tutorials = @user.tutorials
    end
    end
    

    0
    0 Comments

    在这段内容中,用户遇到了一个问题,即当他们使用link_to方法生成链接时,Rails会触发users/:id路由,并将:id => :sign_out传递进去。用户发现这是因为他们在application.js文件中移除了jquery_ujs

    jquery_ujs处理链接中的data-method属性(通过link_to使用method选项生成),该属性用于确定正确的路由,具体解释可以参考这篇文章:https://thoughtbot.com/blog/a-tour-of-rails-jquery-ujs

    因此,解决方法就是确保在application.js中包含以下内容:

    //= require jquery
    //= require jquery_ujs
    

    其他用户也反馈了类似的问题,并提到了JavaScript的影响。其中一个用户将jquery_ujs放在了Bootstrap之后,导致出现问题。解决方法是将顺序改为://= require jquery //= require jquery_ujs //= require bootstrap

    这个问题的出现原因是移除了jquery_ujs,解决方法是重新添加并确保正确的顺序。

    0
    0 Comments

    在升级到Rails 7与ImportMap和Hotwire套件时,我注意到移除了rails-ujs后出现了这个错误。将link_to更改为button_to已经修复了这个错误。

    <%= button_to 'Log out', destroy_user_session_path, method: :delete %>

    https://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#replacements-for-rails-ujs-functionality

    这样可以解决问题...但如果我需要使用link_to呢?

    <%= link_to "Delete post", post_path(post), data: { turbo_method: "delete" } %> 这似乎也是一个选项,对吗?

    原因:移除了rails-ujs,导致无法找到id为sign_out的用户。

    解决方法:将link_to更改为button_to,或者使用link_to并添加data: { turbo_method: "delete" }

    0
    0 Comments

    如果你直接从URL调用/users/sign_out,它不会起作用,因为路由是这样的:

    destroy_user_session DELETE /users/sign_out(.:format)                      devise/sessions#destroy 
    

    也就是说,它使用DELETE方法。你需要将你的devise初始化配置更改为:

    config.sign_out_via = :get
    

    另一个选项是创建一个带有DELETE方法的小表单和按钮。

    0