色々言葉をはしょりすぎな気がします。
ShopモデルがUserモデルにメッセージを送る、というのは、モデル間でメッセージを送るのではなく、
「Userオブジェクトに格納されたメール送信先に送信元Shopオブジェクトの情報と送信先Userオブジェクトの情報を含んだメールを生成して送信する」
ということですよね。
さらに、
・Shopモデルがview_tempを見て、その内容を選択
・選択したデータのtemp_bodyの内容が、そのままメーラーでUserモデルに送信される
というのは、
1.Shopオブジェクトの管理者たるユーザーが、
メール作成画面で複数あるTemlateオブジェクトから一つ選択
1-1.Templateオブジェクトの表示の際、
Templateオブジェクトのview_temp属性にShopオブジェクトのshop_name属性含めた形で表示する
2.Shopオブジェクトの管理者たるユーザーが、メール送信先ユーザーリストから送信先を選択
3.選択されたテンプレートと、送信元Shopオブジェクト、送信先ユーザーオブジェクトから
メールを生成して送信
3-1.メールの本文には、送信元Shopオブジェクトのshop_name属性を表示する
3-2.メール本文には、送信先Userオブジェクトのname属性を表示
ということですよね?
であれば、TemplateモデルにShopのshop_nameとUserのnameを展開して
view_tempとtemp_bodyを出力させれば良いかと。
事前に、展開させるルールを決めておく必要がありますが。
Ruby
1# モデル
2class Shop < ActiveRecord::Base
3 has_many :templates
4 attr_accessible :shop_name
5end
6
7class Template < ActiveRecord::Base
8 belongs_to :shop
9 attr_accessible :title, :view_temp, :temp_body
10
11 # 本文中に存在する[shop_name]の部分を自分の関連するShopのshop_nameに置き換え、
12 # [user_name]の部分を引数userのnameに置き換える
13 def parse_view_temp(user=nil)
14 if user # view_tempを表示させるときにuserが確定している
15 return self.view_temp.gsub('[shop_name]', self.shop.shop_name).gsub('[user_name]', user.name)
16 else # view_tempを表示させるときにuserが確定していない
17 return self.view_temp.gsub('[shop_name]', self.shop.shop_name)
18 end
19 end
20
21 def parse_temp_body(user)
22 return self.temp_body.gsub('[shop_name]', self.shop.shop_name).gsub('[user_name]', user.name)
23 end
24end
25
26class User < ActiveRecord::Base
27 attr_accessible :name, :mail
28end
こんな感じでモデルを書いておけば、
shop.shop_name = "rifuch商店"
user.name = '猫田 rifuch'
tempalte.view_temp = "こんにちは[user_name]様\nいつもお世話になっています[shop_name]です"
template.temp_body = "こんにちは[user_name]様\nいつもお世話になっています[shop_name]です"
の時、
template.parse_view_temp ->
こんにちは[user_name]様
いつもお世話になっていますrifuch商店です
template.parse_temp_body(user) ->
こんにちは猫田 rifuch様
いつもお世話になっていますrifuch商店です
となります。
選択の際にviewで表示させるとき
html
1<!-- 前略 -->
2<%= @template.paese_view_temp %>
3<!-- 後略 -->
メールを送信する
Ruby
1class ShopMailer < ActionMailer::Base
2
3 def message_with_template(template, user)
4 @body = template.parse_temp_body(user)
5 mail to: user.mail
6 mail subject: template.title
7 mail from: template.shop.mail
8 end
9end
メール本文のテンプレート
text.erb
1# view/shop_mailer/message_with_template.text.erb
2<%= @body %>
3-------------------------
4このメールはごにゃごにゃ・・・フッタをここに書く
他にもやり方は色々あると思いますが、一つ一つのステップをもっとはっきりと、
誰が、何を使って、何をするのか、きちんと分解してあげるとどうするべきかがわかると思いますよ。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/22 11:22