2012-02-24 8 views
1

Rubyコードでは、すべての出力メッセージを1つのファイルにまとめて変換します。クライアントが返信メッセージを変更したい場合は、1つのファイルにまとめます。Rubyの動的コンフィグレーションファイル

は私がルートに名前messages.rbと設定ファイルを持っていることを前提としています、私は私のmain.rbルビープロセスでそれを含めるような何か:

は、「#{のroot_path} /config/messages.rb」が必要

puts Messages::MSG[:msg2] 
:私のような何かを私が呼ぶとき今MSG1はmain.rbに言うことができます

class Messages 
    MSG = { 
    :msg1  => "Account successfully created", 
    :msg2  => "Hello" 
    } 
end 

ファイルのようなものが含まれます

しかし、あなたはテほとんどの場合、私はいくつかのデータを含める必要がありますことを、このように特別に

puts Messages::MSG[:msg2] + @username 

のようなものを、それを使用するようにconvientされていない見ることができるように私はいくつかの並べ替えがあると確信していますダイナミックなconfファイルやその他の方法でそれを正しく行うことができますし、最高のパフォーマンスと最高の方法で私に提供することができればそれを感謝します。

ありがとう

+0

これはなぜですか? nient? – Linuxios

+0

cuzは私がvar1 + putsしたいと言うことができますメッセージ:: MSG [:msg] + @ ar2、それはミスです、ここでの主な目的は、コードから分離することです受信することができる動的なconfファイルのようなものを考えていたいくつかのパラメータは次のようになります:hi_msg = Hi $ username。 – Eqbal

答えて

2

Stringではなく、Proc個のオブジェクトを持つのはどうですか?

module Messages 
    MSG = { 
    msg1: ->{"Account successfully created."}, 
    msg2: ->name{"Hello, #{name}. How are you doing?"} 
    msg3: ->name, age{"Hello, #{name}. You are #{age} now, congrats"} 
    } 
end 

次にあなたが

puts Messages::MSG[:msg1].call() 
puts Messages::MSG[:msg2].call(@username) 
puts Messages::MSG[:msg3].call(@username, @userage) 

のようにそれを呼び出すことができますそれとも、すべてのメッセージが同じ引数を取りたい場合は、単に意味をなさない変数を定量化している:

module Messages 
    MSG = { 
    msg1: ->name, age{"Account successfully created."}, 
    msg2: ->name, age{"Hello, #{name}. How are you doing?"} 
    msg3: ->name, age{"Hello, #{name}. You are #{age} now, congrats"} 
    } 
end 

をその後、あなたはそれを

と呼ぶことができます
puts Messages::MSG[:msg1].call(@username, @userage) 
puts Messages::MSG[:msg2].call(@username, @userage) 
puts Messages::MSG[:msg3].call(@username, @userage) 
+0

私はそれが私が探していると思う、ありがとう。すばらしい:) – Eqbal

+0

引き続き引数がない場合でも、Messages :: MSG [:msg1] .call()を呼び出す必要がありますか?実装されていれば直接呼び出すことができます:msg1 => "Account successfully created。"右 ?それはプロップではありません – Eqbal

+0

そうです。それを文字列として保持することができます。しかし、それはそれが少し乱雑になります。これは、メッセージがmsg1かmsg2のどちらであるかによってメッセージを呼び出す方法が異なるためです。私がmsg1をProcにした理由は、一貫性のためです。 – sawa

1

多言語サポートのためにRails I18n APIをチェックする必要があります。 http://guides.rubyonrails.org/i18n.html

そうでなければ、あなたがしているものを使用することができます:あなたは、私が最も使用は、YAMLのlibrarie

+0

一般的な設定ファイルではなく翻訳ファイルを探しているわけではありませんが、パラメータを簡単に追加できるように動的にするため、マーケティングチームに簡単に送信できるファイルの最終結果を残したいと思いますwelcome_msg = welcome Mr. $ username、あなたはそのような$ timeで通知されます – Eqbal

+0

プラス私はレールを使用していません、私はいくつかの配布されたルビーコードを使用しています担当者とのプロセス – Eqbal

+1

私は誤解していました...あなたがRailsを使用していない場合、なぜあなたはそれにタグを付けましたか? I18nを使用すると、文字列にパラメータを渡すことができます。http://guides.rubyonrails.org/i18n.html#passing-variables-to-translations –

0

であなたはロケールファイル内のメッセージを入れることができ.ymlあるかなり確信して話している設定ファイルについてメッセージを使って実際のメッセージを抽出するヘルパーメソッドを提供するか、ApplicationHelperと答えてください。

def message(k) 
    Messages::MSG[k] 
end 

ApplicationHelper

その後の代わりに、メッセージ:: MSG [fooの]すべての時間を参照することで、あなただけのメッセージ(FOO)(少しクリーナー)を呼び出すことができます。

+0

メッセージを既存の文字列と組み合わせたい場合は、インラインアプローチをお勧めします。 "#{message:greeting} Frank、#{message:welcome_message}" –

+0

私はすでにインラインを使っていますが、私はより組織化されたものを見つけることができたので、私はそれを非技術チームに送ることができ、あなたはそれを簡単に変更することができます。私は可能な限りコード自体からそれを分離しようとしています – Eqbal

+0

非技術チームは正確に何を編集していますか?それはアプリケーション内でテンプレートになりますか、どこかのデータベース列のテキストフィールドを更新していますか?正規表現を使用して識別子を検索し($で始まるものすべて)、Messages :: MSGを参照して検索+置換することができます。一致しない場合は、何とか警告する)? –

関連する問題