2011-08-04 9 views
1

私は、スニペットと呼ばれるモデルを持っています。このモデルには、HTMLのスニペットが含まれています。モデル内のRubyメタプログラミング

モデルは、列CODEと

は私が私の見解では、このようなものを書いて、コンテンツを取得したいのですが、別のコンテンツを持っているバック

<%= raw Snippet.PHONE_NUMBER %> 

CODEにPHONE_NUMBERを検索し、コンテンツを返します

答えて

1

# Snippet class 
class << self 
    def method_missing(method, *args, &block) 
    if(snippet = Snippet.find_by_code(method.to_s)) 
     return snippet.content 
    else 
     return super(method, *args, &block) 
    end 
    end 
end 
を次のように Snippetクラスの method_missingクラスメソッドを追加します。

これはトリックを行う必要があります。

しかし、関連するノートでは、コードをデータベースのデータに依存しているため、これを実行するのが最善の方法であるかどうかはわかりません。明日、電話番号のレコードが削除され、コードSnippet.PHONE_NUMBERが壊れます。このアプローチには、多くのメンテナンスの頭痛があります。 (メタプログラミングを避けるだろう)

+0

ありがとう、コードの素敵なビット、作品grest。追加のアドバイスをありがとう、今私のCMSユーザーはコンテンツを編集するだけですが、私がテンプレートを開くときには、これを再考する必要があります。 – creativetechnologist

1

クリーナーのアプローチは、あなたのビューを持つことになり、このような何か:

<%= snippet :PHONE_NUMBER %> 

または

snippet方法は、このようなヘルパーモジュールで定義されて
<%= snippet 'PHONE_NUMBER' %> 

を:

module SnippetHelper 
    def snippet(code) 
    raw Snippet.find_by_code(code.to_s).content 
    end 
end 

class ApplicationController < ApplicationController::Base 
    helper :snippet 
end 
0

または代理人を使用してください。

しかし、別の部分実装、ヘルパー、またはdecent_exposureとヘルパーと部分的な組み合わせの組み合わせを提供しているようです。

関連する問題