質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

1955閲覧

【Rails】モデルのデータ内にrubyの式を記述し、Viewで表示したときにControllerから変数を受け取ることは出来ますか?

jusco

総合スコア80

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/08/21 06:46

ShopモデルがUserモデルにメッセージを送る機能を実装しているのですが、その際のメッセージをテンプレートとして数パターン持っています。

その際に、Templateモデルを作成し、:title, :view_temp(Shopモデル表示用), :temp_body(メーラーに埋め込む用)という3つのカラムを持たせています。

・Shopモデルがview_tempを見て、その内容を選択
・選択したデータのtemp_bodyの内容が、そのままメーラーでUserモデルに送信される

流れとしては、上記のような機能です。

そしてさらに、以下の様な仕様を実現したいです。
・Shopがview_tempを表示した際、自分の:shop_nameを表示する
・Userにメールが届いた際、自分の:nameと相手の:shop_nameを表示する

このように、モデルに格納したデータから変数にアクセスさせることは可能でしょうか?
また、可能でしたらその方法を教えていただきたいです。
不可能な場合、代わりにいい方法があれば教えて頂けますでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

色々言葉をはしょりすぎな気がします。

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/21 08:23

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco

2015/08/22 11:22

もう少し丁寧に記述をするべきでした。 申し訳ありません。 ご回答頂きありがとうございました! 解決いたしましたm(__)m
guest

0

erb

1<%= @template.view_temp.gsub(':shop_name', @shop.name) %>

のようにして表示時に置き換えるしかないように思います。

投稿2015/08/21 08:02

hello-world

総合スコア1342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問