【发布时间】:2013-10-22 01:09:46
【问题描述】:
我正在为 Rails 4 编写一个 gem,它需要向 ApplicationController 添加一些方法,我认为最好的方法是编写一个 rake 任务来打开文件,插入我需要的方法,然后关闭它。使我的方法在类定义中的最佳方法是什么?
class ApplicationController < ActionController::Base
def existing_methods
foo
end
# insert my methods here
end
编辑
在尝试了以下建议但无济于事后,我尝试关注 this post 并最终尝试以下操作:
lib/my_engine.rb
require "my_engine/engine"
require "my_engine/controller_methods"
module MyEngine
end
lib/my_engine/controller_methods.rb
module MyEngine
module ControllerMethods
extend ActiveSupport::Concern
def foo
"foo"
end
end
end
ActiveRecord::Base.send(:include, MyEngine::ControllerMethods)
运行应用程序时,我的 application.slim 包含 = foo 行,我收到以下错误:
#
的未定义局部变量或方法 `foo'
【问题讨论】:
-
您希望您的 gem 真正地编辑 application_controller.rb?在运行时通过重新打开 gem 中的类来扩展 ApplicationController 不是更好吗(或者这不适用于您的 gem 做什么?)您可以尝试从文件底部向上扫描以查找“结束”由'class ApplicationController'匹配——但我确信有些方法可能会被破坏。 (您将尝试自己的解析。)
-
是的,我想直接编辑它。我可能误解了“在运行时扩展”的意思,但是如果应用程序中存在同名的控制器,Rails 会覆盖控制器,所以我不能只在引擎的控制器中编写方法。
-
考虑一个类定义存在于一行的可能性。或者一些尴尬但有效的情况,其中 ApplicationController 是通过调用 Class.new() 定义的
-
考虑调用 ApplicationController.define_method(...) 或类似的东西。或者考虑在运行时将自己的方法修补到“实时”类中。
标签: ruby-on-rails gem ruby-on-rails-4