ruby-on-rails – 在已安装的rails引擎中扩展模型的功能
更新3:
这个解决方案看起来很丑,但是我将装饰器移回了decorators目录,然后将其添加到我的应用程序控制器: require './app/decorators/models/monologue/post_decorator.rb' include ExtendPost require './app/decorators/controllers/monologue/admin/posts_controller_decorator.rb' include ExtendAdminPostsController 关于如何正确做到这一点的想法?谢谢. 但至少这是有效的. 更新2: 以下工作,但有人可以解释如何将此代码放在“正确”的地方,而不是我坚持下去的地方: 在我的main_app中的application_controller.rb中,我现在有: class ApplicationController < ActionController::Base end Monologue::PostsRevision.class_eval do validates :title,:length => {:maximum => 25} end 这可以正常工作,但从组织/代码可读性的角度来看,它位置不好. 更新: 我也根据SO答案here尝试了不同的东西,并最终得到了这段代码,这也没有用: 在app / models / post_revision.rb中(同样在main_app的app文件夹中) require Monologue::PostRevisions::Engine.config.root + 'app' + 'models' + 'page' class PostRevision validates :title,:length => {:maximum => 25} end 这也不起作用. 当尝试使用装饰器和class_eval方法修改Rails 3中挂载的引擎的功能时,装饰器是应该放在main_app中的app文件夹中还是放在引擎的app文件夹中? 我试图修改一个名为Monologue的引擎中的一些模型,我得到了here.我在另一个产品(Refinery)here的网站上找到了如何做到这一点的很好的解释.我也遵循了Rails Guide的说明. 所以我最终得到的代码是: 在lib / monologue / engine.rb中(这应该是在主应用程序或引擎的lib文件夹中吗?我把它放在main_app的lib文件夹中): module Monologue class Engine < ::Rails::Engine isolate_namespace Monologue config.to_prepare do Dir.glob(Rails.root + "app/decorators/**/*_decorator*.rb").each do |c| require_dependency(c) end end end end 在app / decorators / monologue / posts_revisions_decorator.rb中(再次,我把它放在main_app的app文件夹中,而不是Monologue引擎app文件夹中): Monologue::PostsRevision.class_eval do validates :title,:length => {:maximum => 25} end 但这不起作用.额外的验证没有任何作用. 如果这是因为它应该在Monologue挂载的引擎中而不是main_app中的文件夹中,那么我不知道如何做到这一点,因为这些文件不在我的main_app目录中. 思考?谢谢. 解决方法
通过在初始化程序中通过to_prepare加载我的装饰器,我能够克服类似的挑战.尝试这样的事情:
# /config/initializers/my_engine.rb Rails.application.config.to_prepare do require_dependency("./app/decorators/models/my_engine/my_model_decorator.rb") end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |