我试图从字符串中执行内联ruby。该字符串作为文本存储在数据库中,而不是使用ruby。
string = 'The year now is #{Time.now.year}'
puts string
返回
=> The year now is #{Time.now.year}
我希望它返回
=> The year now is 2015
ruby中有没有像这样执行内联ruby的方法?
答案 0 :(得分:6)
是的,你的唯一原因是因为单引号导致字符串文字(意味着没有转义或嵌入')。
string = "The year now is #{Time.now.year}"
puts string
将起作用(注意双引号)。
编辑1:
另一个解决方案(eval除外)是使用字符串插值。
string = 'Time is: %s'
puts string % [Time.now.year]
因此,您可以使用%s
:
string = 'The year now is %s'
=> "The year now is %s"
2.2.1 :012 > string % [Time.now.year]
=> "The year now is 2015"
更多here。
答案 1 :(得分:1)
您可以使用eval
来完成此任务,但请注意,将数据库中的字符串视为代码是非常危险的:
eval('puts "the sum of 2 and 2 is #{2+2}"')
答案 2 :(得分:1)
要使字符串插值工作,您必须使用双引号。使用单引号创建的字符串文字不支持插值。
string = "The year now is #{Time.now.year}"
答案 3 :(得分:0)
我最终创建了一个方法,它将找到内联ruby并在每个ruby部分上使用eval()方法。
def text(text)
text.scan(/\#{.*?}/).each do |a|
text = text.gsub(a,eval(a[2..-2]).to_s)
end
text
end
string = 'The year now is #{Time.now.year}'
puts text(string)
=> The year now is 2015
编辑:
D-side提出了一个更好的解决方案:puts eval %Q("#{string}")
=> The year now is 2015
答案 4 :(得分:0)
您可以使用ERB。
require 'erb'
from_database = 'The time is now #{Time.new.year}'
new_string = from_database.sub(/\#\{/, '<%= ')
new_string = new_string.sub(/\}/, '%>')
puts ERB.new(new_string).run
不检查是否是字符串插值,也不检查是否使用String#%
方法。