【问题标题】:Couldn't find User with id=sign_out找不到 id=sign_out 的用户
【发布时间】:2014-04-24 19:03:58
【问题描述】:

退出链接在我的 rails 应用程序中不起作用。

我检查了下面列出的 routes.rb 并且我的 application.html.erb 看起来遵循正确的路径。

收到以下错误。

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User with id=sign_out
Rails.root: /Users/patrickwalsh/rails_projects/ytutorial

Application Trace | Framework Trace | Full Trace
app/controllers/users_controller.rb:4:in `show'
lib/disable_assets_logger.rb:11:in `call'

我的路线.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? %>
          <li><%= link_to "Log out", destroy_user_session_path, (:method => "delete") %></li>
        <% else %>       
          <li><%= link_to "Log in", new_user_session_path %></li>
          <li><%= link_to "Sign up", new_user_registration_path %></li>
        <% end %>

我的用户控制器以及我怀疑这是问题所在,但不确定错误是什么。

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

【问题讨论】:

标签: ruby-on-rails ruby devise


【解决方案1】:

我遇到了同样的问题。我的路由顺序正确,link_to 方法使用得当,Rails 不断用:id =&gt; :sign_out 触发users/:id 路由。我发现这是因为我从 application.js 文件中删除了 jquery_ujs...

jquery_ujs 处理链接中的data-method 属性(当您使用方法 选项时由link_to 生成),用于确定正确的路线,如下所述:@987654321 @

因此,请确保您的 application.js 中包含以下内容:

//= require jquery
//= require jquery_ujs

【讨论】:

  • 这绝对正确。我复制了一个新的引导主题,突然出现了这个错误。一旦我将这些添加回来,它就起作用了。
  • 很棒的答案。挣扎了一会儿,一直盯着路线,看起来很完美。唉,这是javascript!我有'jquery_ujs',但它是在我的引导之后,需要所以我将顺序更改为: //= 需要 jquery //= 需要 jquery_ujs //= 需要引导
【解决方案2】:

如果您直接从 URL 调用 /users/sign_out 它将不起作用,因为路由是:

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

id est,它使用 DELETE 方法。您需要将设计初始化程序更改为:

config.sign_out_via = :get

其他选项是使用 DELETE 作为方法创建一个小表单及其按钮。

【讨论】:

    【解决方案3】:

    这对我有用

    #form 
    
    <%= link_to(destroy_user_session_path, {:class => "nav-link", :method => :delete}) do  %>
          <span class="sidebar-normal"> Logout </span>
    <% end %>
    
    #routes
    
    devise_scope :user do
        get '/users/sign_out' => 'devise/sessions#destroy'
      end
    

    【讨论】:

      【解决方案4】:

      你需要移动:

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

      通过您的devise_scope。 Rails 正在从 Routes 文件的顶部寻找路线。您的登出 url 与 users/:id 匹配,因此它正在尝试以 sign_out 为 id 呈现显示操作。

      更新:

      实际上,您真的需要devise_scope 块中的最后一行吗?

      【讨论】:

      • 感谢@BroiSatse,这是devise_scope 块中的底线打破了它。感谢您的帮助!
      【解决方案5】:

      这些解决方案都不适合我。 它也发生在我的开发模式中...... 我通过添加来修复它

        if params[:id] = "sign_out"
          sign_out current_user
          return
        end
      

      在设置用户函数中。不是最漂亮的解决方案,但它确实有效......

      【讨论】:

        【解决方案6】:

        由于没有其他答案有效,我发现您可以更改每个设计端点的基本路径,如here 所述。所以,我所做的就是在routes.rb 上给用户devise_for

        devise_for :users,
                 path: 'devise'
        

        然后,我所有的设计路线都以 devise 而不是 users 开始,因此冲突消失了。

        【讨论】:

          【解决方案7】:

          很抱歉提出这个问题,但“正确”的答案是不要乱搞可能破坏许多东西的路线。

          如果您想在 GET 上断开连接,然后像在 initializer/devise.rb 中那样实际配置设计

            # The default HTTP method used to sign out a resource. Default is :delete.
            config.sign_out_via = :get
          

          如设计文档中所述。

          【讨论】:

            【解决方案8】:

            简答:将 link_to 与 DELETE 方法一起使用

            <%= link_to 'Logout', destroy_user_session_path(current_user), method: :delete %>
            

            解释: 如果你看看你的路线,你会看到

            助手 销毁用户会话路径

            HTTP 动词是 删除

            路径

            /users/sign_out(.:format)

            控制器#Action

            设计/会话#destroy

            link_to 默认方法是 get,这就是“原因”(以简单的解释方式)。但是,您可以使用方法指定::方法名称

            【讨论】:

              【解决方案9】:

              我在删除 rails-ujs 后开始注意到这个错误。这是使用 ImportMap 和 Hotwire 套件升级到 Rails 7 的一部分。在这种情况下,将 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

              【讨论】:

                猜你喜欢
                • 2015-07-15
                • 1970-01-01
                • 1970-01-01
                • 2012-05-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-05-03
                相关资源
                最近更新 更多