更新 3:
这个解决方案看起来很难看,但我将装饰器移回装饰器目录,然后将其添加到我的应用程序控制器中:
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 答案尝试了一些不同的方法,最后得到了这段代码,但它也不起作用:
在 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 的引擎中的一些模型。我在这里找到了一个关于如何在不同产品(炼油厂)的网站上做到这一点的很好的解释。而且我还按照这个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 目录中。
想法?谢谢。