3

レーキ タスクを使用して、24 時間ごとにニュースレターを自動的に生成しています。ニュースレターの上部に、管理者がカスタマイズしたメッセージを入力できるセクションがあります。管理者が使用する画面には、コレクションを取得する haml パーシャルを使用してレンダリングされた、ニュースレターのライブ プレビューがあります (彼らはこれに固執していました)。

電子メールを生成して送信するために、生成したい電子メールの HTML を (とりわけ) 含むサードパーティ API に xml ドキュメントを送信しています。

私がやりたいのは、この haml パーシャルの出力を rake タスク内に保存することです。これは、PHP の ob_*() バッファリング関数に似ています。次のようなことをする方法はありますか?

ob_start();
render :partial => newsletter, :collection => posts
newsletter_html = ob_get_contents()
xml = "
<Creative>
  <Name>Our Newsletter -- #{Time.now.strftime('%m/%d/%Y')}</Name>
  <HTML>&lt;html&gt;&lt;body&gt;#{newsletter_html}&lt;/body&gt;&lt;/html&gt;</HTML>
  ...
</Creative>"

おそらく明らかな何かが欠けているので、これを行ういくつかの方法を考えることができますが、それらのほとんどは DRY ではなく、ヘルパー、モデル、またはタスク自体で大量の html を生成したくありません。

これを達成する方法があれば教えてください。

4

3 に答える 3

3

HAMLドキュメントからのより直接的なアプローチ:

require 'haml'
haml_string = "%p Haml-tastic!"
engine = Haml::Engine.new(haml_string)
engine.render #=> "<p>Haml-tastic!</p>\n"

HAMLテンプレートをロードし、補間が必要なローカル変数を設定するために少し作業を行う必要がありますが、柔軟性がそれを補う可能性があります。

于 2009-08-11T22:45:46.790 に答える
2

これを行う一般的な方法 (通常は推奨されません) は、モデルまたは rake タスクで文字列にレンダリングすることです。


cached_content = 
  ActionView::Base.new(Rails::Configuration.new.view_path).render(:partial => "newsletter", :locals => {:page => self,:collection => posts})

詳細については、こちらを参照してください: http://www.compulsivoco.com/2008/10/rendering-rails-partials-in-a-model-or-background-task/

ページまたはフラグメントのキャッシュを使用している場合は、コンテンツをキャッシュから引き出すことができます。これを行う最も簡単な方法は、キャッシュを有効にしてから、ファイルが配置されている場所を確認することです。

http://guides.rubyonrails.org/caching_with_rails.html

于 2009-08-11T16:50:50.360 に答える
0

暗闇の中でのちょっとしたショットですが、Hamlのrdocをチェックすると、文字列といくつかの変数を受け入れて出力をレンダリングするメソッドがある可能性が高いです。

ERBを使用すると、次のようになります。

require 'erb'

name = 'world'
template = 'hello <%= name %>'
template = ERB.new(template)
puts template.result(binding)
于 2009-08-11T16:55:32.490 に答える