26

これが私の問題です。

モデルに格納されている文字列を取得し、実行時にRailsアプリケーションの変数を使用してその一部を変更したいと思います。次に例を示します。

私はメッセージモデルを持っています。これを使用して、いくつかの固有のメッセージを保存します。したがって、異なるユーザーが同じメッセージを持っていますが、メッセージの途中に自分の名前を表示できるようにしたいと思います。

"Hi #{user.name}, ...."

それをデータベースに正確に保存しようとしましたが、ビューに表示される前にエスケープされるか、データベースに保存するときにRailsコンソールを介して補間されます。

前もって感謝します。

4

5 に答える 5

61

カスタム文字列ヘルパー関数を定義する理由がわかりません。Rubyは、非常に優れたフォーマットアプローチを提供します。例:

"Hello %s" % ['world']

また

"Hello %{subject}" % { subject: 'world' }

どちらの例も「Helloworld」を返します。

于 2014-04-29T09:23:07.180 に答える
22

お望みならば

"Hi #{user.name}, ...."

データベースで、一重引用符を使用するか#、バックスラッシュでエスケープして、Rubyが#{}すぐに補間しないようにします。

s = 'Hi #{user.name}, ....'
s = "Hi \#{user.name}, ...."

次に、後で補間を実行するときに、大胆であるか信頼している場合は、次を使用できますeval

s   = pull_the_string_from_the_database
msg = eval '"' + s + '"'

sを機能させるには、二重引用符で囲まれた文字列に変換する必要があることに注意してくださいeval。これは機能しますが、これは最も優れたアプローチではなく、あらゆる種類の奇妙で紛らわしいエラーが発生する可能性があります。あなた(または他の信頼できる人)が文字列を書いている限り、それは大丈夫なはずです。

単純なマイクロテンプレートシステムを使用したほうがよいと思います。これは、次のような単純なものでもかまいません。

def fill_in(template, data)
  template.gsub(/\{\{(\w+)\}\}/) { data[$1.to_sym] }
end
#...
fill_in('Hi {{user_name}}, ....', :user_name => 'Pancakes')

もちろん、好きな区切り文字を使用できます{{...}}。最近、Mustache.jsとHandlebars.jsを使用しているので、一緒に使用しました。この単純な実装には問題があります(テンプレート内のフォーマットオプション、区切り文字のエスケープなどはありません)が、それで十分かもしれません。テンプレートがより複雑になった場合は、おそらくString#%またERBはうまくいく可能性があります。

于 2011-07-21T17:19:24.430 に答える
0

これを行うことを考える1つの方法は、たとえば次のようにテンプレートを保存することです。

「こんにちは名前」

次に、テンプレートタグ(名前)を渡された引数に置き換えるだけの関数をモデルに追加します。ログインしたユーザーの場合もあります。

この新しい関数はモデルの一部になるため、html.erbファイルを含め、レール内のどこからでもモデルの別のフィールドのように使用できます。

お役に立てば幸いです。さらに説明が必要な場合はお知らせください。

于 2011-07-21T15:06:07.413 に答える
0

Procsを使用して別の可能な解決策を追加する:

#String can be stored in the database
string = "->(user){ 'Hello ' + user.name}"

proc = eval(string)

proc.call(User.find(1)) #=> "Hello Bob"
于 2015-07-23T06:34:37.227 に答える
0

gsubRubyでは非常に強力です。

2番目の引数としてハッシュを使用するため、次のように置き換えるキーのホワイトリストを提供できます。

template = <<~STR
Hello %{user_email}!

You have %{user_voices_count} votes!

Greetings from the system
STR

template.gsub(/%{.*?}/, {
  "%{user_email}" => 'schmijos@example.com',
  "%{user_voices_count}" => 5,
  "%{release_distributable_total}" => 131,
  "%{entitlement_value}" => 2,
})

それと比較しERBて安全です。また、 ( )を使用した%文字列補間のように、単一の未使用または存在しないキーについては文句を言いません。%sprintf

于 2021-12-08T21:07:52.170 に答える