如何在可重新加载开发环境的情况下将可安装引擎的模型扩展到另一个可安装引擎中
使用Rails 3.2.2和Ruby 1.9.2。
我有一个rails可安装引擎EngineA
,它声明一个inheritanceActiveRecord::Base
forms的User
类。 我有另一个引擎EngineB
想要向EngineA::User
注入function。 现在我所做的如下所示:
方法1:
#EngineA app/models/engine_a/user.rb module EngineA class User < ActiveRecord::Base has_attached_file :avatar has_many :somethings end end #EngineB lib/engine_b/user.rb module EngineB module User def self.extended obj obj.class_eval do has_many :something_elses end end end end EngineA::User.extend EngineB::User
这给了我一个uninitialized constant EngineA::User
错误。 即使我需要特定文件,我EngineA
需要回形针的问题,以便了解has_attached_file
。 当我意识到我必须知道并要求EngineA
内的EngineB
的依赖关系时,这条道路就结束了。
方法2:
我使用了与之前相同的代码,只是我从EngineB
user.rb文件中删除了最后一行EngineA::User.extend EngineB::User
。 然后我将该调用移动到EngineB
内的初始化EngineB
。
#EngineB config/initializers/my_mixin.rb EngineA::User.extend EngineB::User
这完美地工作! 除了在开发模式下我会更改代码并且模型会刷新。 唯一刷新的是EngineA::User
而不是我作为初始化程序EngineA::User
的mixin。 因此,一旦我更改了代码,我就失去了所有扩展function。
我甚至不肯定这是最“有效”的方式来做到这一点…任何帮助都将非常感激。 提前致谢。
根据配置文档 ,您可以使用ActionDispatch
回调来加载项目。 如果cache_classes
设置为false,则在每次请求时都会运行这些回调,就像在开发模式下一样。
在您的EngineB.rb
文件中,您可以尝试这样的事情:
if Rails.env.development? ActionDispatch::Callbacks.to_prepare do load "#{File.expand_path(File.dirname(__FILE__))}/../config/initializers/my_mixin.rb" end end
- 双splat运算符破坏性地修改哈希 – 这是一个Ruby错误吗?
- 是什么导致这个未定义的方法`model_name’为Hash:Class
- 如何从特定分支更新我的git子模块?
- 在rails中进行Http基本身份validation
- I18n:使用’t(:test_key)’,’t(’test_key’)’和’t(’。test_key’)’有什么区别?
- Twilio Ruby发送短信 – 未定义的方法`消息’
- 如何在Ruby中使正则表达式的一部分可选?
- Rails 3.2 Postgres保存错误“ActiveRecord :: StatementInvalid:PG ::错误:错误:位置5’T’附近的语法错误”
- 在没有ssh-keygen的情况下生成SSH密钥对(私有/公共)