ruby-on-rails – 猴子补丁Devise(或任何Rails宝石)

我在Rails项目中使用了 Devise认证宝石,而且我想更改闪存警报中使用的密钥. (Devise使用:通知和:提醒闪光键,但我想将它们更改为:成功和:错误,以便我可以显示漂亮的绿色/红色框与 Bootstrap.)

所以我想要能够以某种方式覆盖DeviseController中的set_flash_message方法.

这是新的方法

def set_flash_message(key,kind,options = {})

  if key == 'alert'
    key = 'error'
  elsif key == 'notice'
    key = 'success'
  end

  message = find_message(kind,options)
  flash[key] = message if message.present?

end

但我只是不知道该放在哪里.

更新:

基于答案我创建了一个配置/ initializers / overrides.rb文件与以下代码

class DeviseController
    def set_flash_message(key,options = {})
       if key == 'alert'
          key = 'error'
       elsif key == 'notice'
          key = 'success'
       end
       message = find_message(kind,options)
       flash[key] = message if message.present?
    end
end

但是,每个Devise操作都会导致错误

Routing Error: undefined method ‘prepend_before_filter’ for
Devise::SessionsController:Class

解决方法

如果您尝试重新打开类,它与声明新类的语法相同:
class DeviseController
end

如果这个代码在真正的类声明之前执行,它将继承自Object而不是扩展Devise声明的类.相反,我尝试使用以下

DeviseController.class_eval do
  # Your new methods here
end

这样,如果DeviseController尚未声明,您将收到错误.因此,您可能会最终结束

require 'devise/app/controllers/devise_controller'

DeviseController.class_eval do
  # Your new methods here
end

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...