2015-07-18 4 views
0

Im пытается выполнить встроенный рубин из строки. Строка хранится в базе данных в виде текста и не создается с использованием ruby.Выполнить встроенный рубин из строки

string = 'The year now is #{Time.now.year}' 
puts string 

Это возвращает

=> The year now is #{Time.now.year} 

Я хочу, чтобы вернуть

=> The year now is 2015 

Есть ли способ в рубин, который будет выполнять встроенный рубин, как это?

+0

Вы можете посмотреть на ERB, чтобы это сделать, но нужно будет соответствующим образом изменить '' '' часть. И вы также получите безопасность от ERB. – vgoff

ответ

0

В результате я создал метод, который найдет встроенный рубин и применит метод 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 

Edit:

D-сторона выступила с гораздо лучшим решением:

puts eval %Q("#{string}") 
=> The year now is 2015 
6

Да, единственная причина, по которой ваша работа не срабатывает, заключается в том, что одинарные кавычки вызывают строковый литерал (что означает, что не существует экранов или вложений).

string = "The year now is #{Time.now.year}" 
puts string 

будет работать (обратите внимание на двойные кавычки).

Edit 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.

+0

Как я уже сказал, строка загружается из базы данных и не выполнена в рубине, это было просто примером. я не могу изменить исходную строковую переменную. –

+0

Я обновлю одну секунду. – wkcamp

+0

, если в базу данных также включены одинарные кавычки, которые вы будете иметь для регулярного выражения и замените их. Посмотрите, например, на String # gsub. – three

1

Вы можете использовать eval для достижения этой цели, но имейте в виду, что обработка строк в базе данных как кода является очень рискованным:

eval('puts "the sum of 2 and 2 is #{2+2}"') 
+0

Как я могу использовать строковую переменную в eval? eval ('puts "# {string}"') даст мне то же самое, что и исходный результат –

+0

@lassvi невозможно. Покажите, что именно вы пробовали. –

+0

И если ответ не делает этого достаточно ясно: ** убедитесь, что вы можете доверять всем входящим строкам, поскольку они могут содержать произвольный код, который будет выполнен **. Вы не хотите, чтобы ваши пользователи стирали/изменяли части вашего приложения, не так ли? :] –

1

Для интерполяции строк, чтобы работать, вы должны использовать двойные кавычки .. строковый литерал созданный с одинарными кавычками, не поддерживает интерполяцию.

string = "The year now is #{Time.now.year}" 
0

Вы можете использовать Еврорадио для этого.

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#% метода.

+0

Это удалит все «}» из текста tho, даже если бы он не был частью встроенного рубина:/(Но это было бы отлично сработало для примера я имел в своем вопросе, но в базе данных будет много другого текста) –

+0

Да, но вы не спрашивали и не выносили это. Удаление этого кода может быть временным, хотя для оценки вы всегда можете представить исходные данные. Это не большое использование регулярных выражений. Я могу ответить только на этот вопрос и, надеюсь, не ошибаюсь, делая это с тем, что представлено. :) – vgoff

Смежные вопросы