Rails(3.0.14)アプリケーションには、ユーザーがHTML形式の電子メールを受信するかどうかを選択できるユーザープロファイルがあります。物事を乾いた状態に保つために、すべてのメール(HTML)に対して1セットのテンプレートのみを設定し、テキスト/プレーン部分に独自の文字列拡張機能dehtml
(基本的にいくつかのフォーマット変更を含む)を使用したいと思います。strip_tags
また、メーラーコードはDRYのままにしておきたいです。
これまでのところ、メーラーメソッドは次のようになっています。
def signup_confirmation(user)
@user = user
mail(:to => @user.email, :subject => ..., ...)
end
1. DRYテンプレート:可能であれば、200個の追加のメールテンプレートを作成する必要をなくし、HTMLテンプレートからテキスト/プレーン部分を自動作成したいと思います。これが基本的な考え方dehtml
です(私自身の文字列拡張子です):
def signup_confirmation(user)
@user = user
mail(:to => @user.email, :subject => ..., ...) do |format|
format.html
format.text { render(:file => 'signup_notification.html').dehtml }
end
end
ただし、これは「テンプレートがありません」エラーで失敗します。どちらの場合もHTMLテンプレートを使用するようにRailsに指示するにはどうすればよいですか?追加:formats => :html
してみ:handler => :html
ましたが、役に立ちませんでした。
現在、ここに解決策はありません。何か案は?
2:DRYメーラーメソッド: ユーザーはHTMLを使用するかどうかを決定できる必要があるため、上記のメソッドは次のようになります。
def signup_confirmation(user)
@user = user
attachments.inline["email-header.jpg"] = File.read(...) if @user.wants_html
mail(:to => @user.email, :subject => ..., ...) do |format|
format.html if @user.wants_html
format.text { render(:file => 'signup_notification.html').dehtml }
end
end
全体として、これにより各メソッドのLOCが3倍になります。これを可能な限り乾燥させたいと思います(少なくとも200のメーラーメソッドに挿入する必要があるため)。1つのアイデアは、私自身のmail
メソッド(それを呼びましょうmymail
)を次のように書くことです。
def mymail(user, p={})
attachments.inline["email-header.jpg"] = File.read(...) if user.wants_html
mail(p) do |format|
format.html if user.wants_html
format.text
end
end
(上記のテキストテンプレートの問題は今のところ無視します)次に、のように、各呼び出しをに変更しますmail
。mymail
def signup_confirmation(user)
@user = user
attachments.inline["email-header.jpg"] = File.read(...) if @user.wants_html
mymail(user, { :to => @user.email, :subject => ..., ... })
end
これは機能します。しかし、それは良い習慣ですか?どこに置くのが一番いいmymail
ですか?ヘルパーに入れますか?
洞察や推奨事項は大歓迎です!