4

更新 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 ディレクトリにないため、その方法がわかりません。

考え?ありがとう。

4

2 に答える 2

3

イニシャライザーで 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
于 2014-01-30T14:21:41.307 に答える