更新 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 answer 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 のアプリ フォルダーに配置する必要がありますか?それともエンジンのアプリ フォルダーに配置する必要がありますか?
ここで入手したモノローグというエンジンのモデルの一部を変更しようとしています。別の製品 (Refinery) のサイトでそれを行う方法の適切な説明を見つけました。また、この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 で (これも、Monologue エンジンの app フォルダーではなく、main_app の app フォルダーに入れました):
Monologue::PostsRevision.class_eval do
validates :title, :length => {:maximum => 25}
end
しかし、これはうまくいきません。追加の検証は何もしません。
これが、main_app ではなく、Monologue にマウントされたエンジンのフォルダー内に移動することになっているためである場合、これらのファイルは main_app ディレクトリにないため、その方法がわかりません。
考え?ありがとう。