Ruby on rails 如何覆盖设计安全扩展PasswordExpiredController

Ruby on rails 如何覆盖设计安全扩展PasswordExpiredController,ruby-on-rails,devise,Ruby On Rails,Devise,我想覆盖显示逻辑,以便不仅在密码过期时,而且在几天前允许更改密码。在过滤逻辑之前,我需要修改或替换此 def skip_password_change return if !resource.nil? && resource.need_change_password? redirect_to :root end 我想让我的控制器如下: class PasswordsController < Devise::PasswordExpiredController

我想覆盖显示逻辑,以便不仅在密码过期时,而且在几天前允许更改密码。在过滤逻辑之前,我需要修改或替换此

def skip_password_change
    return if !resource.nil? && resource.need_change_password?
    redirect_to :root
end
我想让我的控制器如下:

class PasswordsController < Devise::PasswordExpiredController
    # ...
    def skip_password_change
        return if !resource.nil? && (resource.need_change_password? || ... )
        redirect_to :root
    end
end
类密码控制器
如何实现我的目标

UPD:
下面所有的答案都是对的,我遗漏了一件事——我的自定义控制器被放在controllers/admin目录中,所以我应该将其命名为admin::CustomPasswordExpiredController,但我遗漏了名称空间前缀admin,rails陷入了循环依赖

您可以尝试此解决方法,首先跳过
跳过密码更改
方法的默认
操作之前
,然后添加自定义方法将其包装在条件中。试试这个

class PasswordsController < Devise::PasswordExpiredController
  skip_before_action :skip_password_change, only: :show
  before_action :skip_password_change_show, only: :show

  def skip_password_change_show
    return if !resource.nil? && (resource.need_change_password? || #yourcondition )
    redirect_to :root
  end
end
类密码控制器

希望有帮助

转到路由文件并覆盖其中的控制器方法


类似于
designe\u for:users,controllers:{x:'y'}
的内容,其中x是要覆盖的designe控制器的名称,y是要覆盖的自定义控制器的名称

只需使用自定义控制器扩展designe控制器即可:

# config/routes.rb
devise_for :users, controllers: { passwords: 'custom_passwords' }

# app/controllers/custom_passwords_controller.rb
class CustomPasswordsController < Devise::PasswordsController
  def edit
    resource = resource_class.new
    return unless resource.need_change_password? # your middleware logic here
    super
  end
end
#config/routes.rb
为用户、控制器设计密码:{passwords:'custom_passwords'}
#app/controllers/custom_passwords_controller.rb
类CustomPasswordsController

更多设施可在Desive中找到(通过单击“查看来源”)

plz发布您的错误堆栈跟踪无法再现错误,我将问题简单地改为“如何…”,因为我不是舒尔,如果在这里使用Desive_是正确的,因为security_extension_gem补丁程序路由不使用designe_for method:问题是:如何使应用程序使用我的自定义密码控制器,而不是designe::passwordexpireedcontroller,它是由designe_security_extensions gem引入的