1

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

(上記のテキストテンプレートの問題は今のところ無視します)次に、のように、各呼び出しをに変更しますmailmymail

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ですか?ヘルパーに入れますか?

洞察や推奨事項は大歓迎です!

4

1 に答える 1

1

私はずっと前にあなたの最初の解決策と非常によく似たことをしました。なぜそれがそのままである必要があるのか​​ よく覚えていませんが、これは私にとってはうまくいっています:

def my_mail
  mail(:to => @user.email ...) do |format|
    format.text { convert_html_to_plain(__method__) } # first text
    format.html                                       # then html
  end
end

def convert_html_to_plain(method)
  old_formats = self.formats
  self.formats = ["html"]
  rendered = render "#{method}", :layout => false
  self.formats = old_formats

  # strip tags, reformat, etc. from rendered
  rendered << render(:partial => "plaintext_footer", :locals => {:user => @user}, :formats => [:text] )
end
于 2012-10-28T02:04:25.957 に答える