从字符串执行内联ruby

时间:2015-07-18 21:57:58

标签: ruby

我试图从字符串中执行内联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的方法?

5 个答案:

答案 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#%方法。