[英]Extending the functionality of a model in a mounted rails engine
更新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
这可以正常工作,但从组织/代码可读性的角度来看,它位置不好。
更新:
我也根据这里的答案尝试了不同的东西,最后得到了这个代码,这也没有用:
在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文件夹中?
我试图修改某些型号的叫独白的引擎,我在这里 。 我在这里找到了一个很好的解释,说明如何在不同产品(炼油厂)的网站上做到这一点 。 我也按照Rails指南中的说明进行操作。
所以我最终得到的代码是:
在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
另一种方法是activesupport-decorators gem。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.