【问题标题】:"undefined method `user_signed_in?' when `devise_For` is missing“未定义的方法‘user_signed_in?’当 `devise_For` 缺失时
【发布时间】:2021-04-05 18:26:05
【问题描述】:

我想删除设计路线,因为我为我的目的构建了自定义路线和控制器。但是,我注意到当我删除路由中的 devise_for :users 行并将其替换为仅...

路由文件

  devise_scope :user do
    delete 'logout', to: 'devise/sessions#destroy'
  end

我没有收到错误:

查看:

错误:

"未定义的方法`user_signed_in?'对于#"

为什么助手需要路由?它需要哪些路线?我可以只定义助手吗?

我也打算用current_user.present?sign_in @user,但不知道以后会不会出错,因为我无法通过未定义的方法。

来自设计宝石:https://github.com/heartcombo/devise/blob/45b831c4ea5a35914037bd27fe88b76d7b3683a4/lib/devise/rails/routes.rb

# Let's say you have an User model configured to use authenticatable,
    # confirmable and recoverable modules. After creating this inside your routes:
    #
    #   devise_for :users
    #
    # This method is going to look inside your User model and create the
    # needed routes:
    #
    #  # Session routes for Authenticatable (default)
    #       new_user_session GET    /users/sign_in                    {controller:"devise/sessions", action:"new"}
    #           user_session POST   /users/sign_in                    {controller:"devise/sessions", action:"create"}
    #   destroy_user_session DELETE /users/sign_out                   {controller:"devise/sessions", action:"destroy"}
    #
    #  # Password routes for Recoverable, if User model has :recoverable configured
    #      new_user_password GET    /users/password/new(.:format)     {controller:"devise/passwords", action:"new"}
    #     edit_user_password GET    /users/password/edit(.:format)    {controller:"devise/passwords", action:"edit"}
    #          user_password PUT    /users/password(.:format)         {controller:"devise/passwords", action:"update"}
    #                        POST   /users/password(.:format)         {controller:"devise/passwords", action:"create"}
    #
    #  # Confirmation routes for Confirmable, if User model has :confirmable configured
    #  new_user_confirmation GET    /users/confirmation/new(.:format) {controller:"devise/confirmations", action:"new"}
    #      user_confirmation GET    /users/confirmation(.:format)     {controller:"devise/confirmations", action:"show"}
    #                        POST   /users/confirmation(.:format)     {controller:"devise/confirmations", action:"create"}

【问题讨论】:

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


    【解决方案1】:

    devise_for 是 Devise 连接到整个框架并设置其助手的方式。因此,完全跳过并不是您想要的方式。如果您只想更改路径的名称,请改用正确的选项:

    # availabe path_names are 
    # :sign_in, :sign_out, :sign_up, :password, :confirmation, :unlock.
    devise_for :users, only: :sessions, 
      path_names: {
        sign_out: 'logout'
      }
    

    skip:only: 选项可用于限制生成的路由:

    devise_for :users, 
      only: :sessions, 
      path_names: {
        sign_out: 'logout'
      }
    
    devise_for :users, 
      skip: [:registrations, :passwords, :confirmations], 
      path_names: {
        sign_out: 'logout'
      }
    

    如果你真的想使用路径/user/...而不是/users/...

    devise_for :users, only: :sessions, 
      path: 'user',
      path_names: {
        sign_out: 'logout'
      }
    

    虽然不是我推荐的东西。

    ActionDispatch::Routing::Mapper#devise_for

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 2011-06-16
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多