Я играл с рубиновой оценкой в хамле. Это не сработает, если я передам переменную в шаблон haml. это работает только в том случае, если рубиновый код уже находится внутри шаблона (не передается как переменная), я делюсь своим исходным кодом для лучшего объяснения
require 'sinatra'
require 'haml'
get '/' do
@user_input = params[:foo_user_input]
puts @user_input
haml :foo
end
__END__
@@ foo
%p= "hello"
<br>
%p= 7*7
<br>
%p= #{@user_input}
<br>
%p This is #{7*7} cake!
<br>
%p This is #{@user_input} cake!
<br>
%p= @user_input
<br>
если я передам 7*7 в запрос GET, как вы можете видеть, я получу именно 7*7, где он не оценивается как 49. он оценивается только в том случае, если я уже разместил 7*7 в самом шаблоне haml.
hello
49
This is 49 cake!
This is 7*7 cake!
7*7

Если вы хотите оценить код Ruby, хранящийся в строковой переменной, вы можете использовать eval следующим образом:
%p This is #{eval(@user_input)} cake!
Предупреждение: Но никогда не передавайте строки для оценки из ненадежного источника. Злоумышленник может передать вашему методу код, который загружает наши пароли на их сервер или удаляет ваш жесткий диск.
Спасибо, так что нельзя передать его как переменную без eval?
Все, что передается из браузера в веб-приложение, передается в виде строки. Вы можете перевести эти строки в целое число, дату или что-то еще. Но этот перевод должен иметь смысл (например, вы не можете перевести «foo» в число) и он должен быть безопасным, потому что вы не можете доверять клиенту. В этом примере я вижу только два варианта: 1) оценить строку на клиенте в браузере и отправить результат только на сервер. Или проанализируйте строку шаг за шагом, чтобы убедиться, что она содержит только числа и операторы и поэтому может считаться безопасной перед оценкой.
Есть такие инструменты, которые просто занимаются математикой.
@user_input— это строка, то есть она эквивалентна'7*7', а не7*7. Попробуйте интерполировать строку через#{'7*7'}вместо#{7*7}, и вы увидите, что она ведет себя идентично вашей@user_input. И нет, вы не хотите оценивать пользовательский ввод как код Ruby на стороне сервера.