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

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

ただいまの
回答率

88.04%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,463

score 80

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を表示する

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

よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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を出力させれば良いかと。
事前に、展開させるルールを決めておく必要がありますが。

# モデル
class Shop < ActiveRecord::Base
  has_many :templates
  attr_accessible :shop_name
end

class Template < ActiveRecord::Base
  belongs_to :shop
  attr_accessible :title, :view_temp, :temp_body
  
  # 本文中に存在する[shop_name]の部分を自分の関連するShopのshop_nameに置き換え、
  # [user_name]の部分を引数userのnameに置き換える
  def parse_view_temp(user=nil)
    if user # view_tempを表示させるときにuserが確定している
      return self.view_temp.gsub('[shop_name]', self.shop.shop_name).gsub('[user_name]', user.name)
    else # view_tempを表示させるときにuserが確定していない
      return self.view_temp.gsub('[shop_name]', self.shop.shop_name)
    end
  end
  
  def parse_temp_body(user)
    return self.temp_body.gsub('[shop_name]', self.shop.shop_name).gsub('[user_name]', user.name)
  end
end

class User < ActiveRecord::Base
  attr_accessible :name, :mail
end
こんな感じでモデルを書いておけば、
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で表示させるとき
<!-- 前略 -->
<%= @template.paese_view_temp %>
<!-- 後略 -->
メールを送信する
class ShopMailer < ActionMailer::Base

  def message_with_template(template, user)
    @body = template.parse_temp_body(user)
    mail to: user.mail
    mail subject: template.title
    mail from: template.shop.mail
  end
end
メール本文のテンプレート
# view/shop_mailer/message_with_template.text.erb
<%= @body %>
-------------------------
このメールはごにゃごにゃ・・・フッタをここに書く

他にもやり方は色々あると思いますが、一つ一つのステップをもっとはっきりと、
誰が、何を使って、何をするのか、きちんと分解してあげるとどうするべきかがわかると思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/22 20:22

    もう少し丁寧に記述をするべきでした。
    申し訳ありません。

    ご回答頂きありがとうございました!
    解決いたしましたm(__)m

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

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