[英]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.