我想创建一个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;来逃避插值的情况下创建此类记录? ?
答案 0 :(得分:3)
你可以这样做,除非你想使用像eval
这样讨厌的东西。字符串插值仅在字符串文字中进行,您不能说s = '#{x}'
(不是单引号),然后在您想要使用x
时替换s
。
虽然有String#%
:
str%arg→new_str
格式 - 使用 str 作为格式规范,并返回将其应用于 arg 的结果。如果格式规范包含多个替换,则 arg 必须是包含要替换的值的
Array
或Hash
。有关格式字符串的详细信息,请参阅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