在应用程序中扩展ActionController :: Base

时间:2015-06-11 21:05:07

标签: ruby-on-rails ruby-on-rails-4 devise actioncontroller sorcery

我希望以与Devise和Sorcery等插件公开current_user方法相同的方式向我的控制器和视图公开方法。事实上,我正在捎带这个功能。然而,我试图为这个巫术避风港的正确语法进行神圣的尝试。这是我到目前为止所得到的......

# config/initializers/extra_stuff.rb
module ExtraStuff
  class Engine < Rails::Engine
    initializer "extend Controller with extra stuff" do |app|
      ActionController::Base.send(:include, ExtraStuff::Controller)
      ActionController::Base.helper_method :current_username
    end
  end
end

module ExtraStuff
  module Controller
    def self.included(klass)
      klass.class_eval do
        include InstanceMethods
      end
    end

    module InstanceMethods
      def current_username
        current_user.username
      end
    end
  end
end

当我尝试从控制器操作或视图中调用current_username时,我得到通常的未定义错误:

undefined local variable or method `current_username'

此方法的目的是针对特定应用,我不需要制作插件。我只提到这一点,因为到目前为止我所挖掘的参考资料仅从构建Rails引擎/插件的角度讨论了这个问题。当然,在这一点上,这正是我的代码所做的,而且它仍然无法正常工作。 o.O

运行Rails 4.2

更新:我可以通过移动Rails::Engine内的内容来使功能正常工作。

module ExtraStuff
  module Controller
    def current_username
      current_user.username
    end
  end
end

ActionController::Base.send(:include, ExtraStuff::Controller)
ActionController::Base.helper_method :current_username

但是,我不明白为什么这甚至是必要的。 Rails引擎应该使用ActionController::Base的扩展进行初始化。我错过了什么?

0 个答案:

没有答案