在模型的属性中包含字符串插值

时间:2014-05-30 17:18:45

标签: ruby-on-rails ruby string postgresql model

我想创建一个Active Record对象,其字符串属性包含字符串插值。

我的模型架构如下所示:

  create_table "twilio_messages", force: true do |t|
    t.string   "name"
    t.string   "body"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

我使用Active Admin创建了此模型的对象,如下所示:

  => #<TwilioMessage id: 5, name: "weekly_message", body: "\#{user.firstname} you're on the list for this week'...", created_at: "2014-05-29 22:24:36", updated_at: "2014-05-30 17:14:56"> 

问题是我为正文创建的字符串应如下所示:

"#{user.firstname} you're on the list for this week's events! www.rsvip.biz/#events"

这样user.firstname就会插入到字符串中,从而打印出用户的名字。

如何在没有数据库自动尝试使用&#34; \&#34;来逃避插值的情况下创建此类记录? ?

1 个答案:

答案 0 :(得分:3)

你可以这样做,除非你想使用像eval这样讨厌的东西。字符串插值仅在字符串文字中进行,您不能说s = '#{x}'(不是单引号),然后在您想要使用x时替换s

虽然有String#%

  

str%arg→new_str

     

格式 - 使用 str 作为格式规范,并返回将其应用于 arg 的结果。如果格式规范包含多个替换,则 arg 必须是包含要替换的值的ArrayHash。有关格式字符串的详细信息,请参阅Kernel::sprintf

所以你可以使用这样的body

m = TwilioMessage.create(
  :body => "%{firstname} you're on the list for this week's events! www.rsvip.biz/#events",
  ...
)

然后,当您拥有user时,请填写以下消息:

body = m.body % { :firstname => user.firstname }

当然,您必须知道%{firstname}在字符串中。如果您只想要插入少量内容,那么您可以提供所有内容,让%选择所需的内容:

body = m.body % {
  :firstname => user.firstname,
  :lastname  => user.lastname,
  :email     => user.email
}

甚至为用户添加方法:

def msg_vals
  {
    :firstname => self.firstname,
    :lastname  => self.lastname,
    :email     => self.email
  }
end

然后说出类似的话:

body = m.body % user.msg_vals