Il codice che pensi non funzioni, fa:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Le cose diventano più interessanti se var può contenere meta-caratteri di espressioni regolari. Se lo fa e vuoi che quei caratteri mat facciano quello che fanno di solito in un'espressione regolare, allora lo stesso gsub funzionerà:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
Tuttavia, se la stringa di ricerca contiene metacaratteri e non vuoi che vengano interpretati come metacaratteri, utilizza Regexp.escape in questo modo:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Oppure assegna a gsub una stringa invece di un'espressione regolare. In MRI> = 1.8.7, gsub tratterà un argomento di sostituzione di stringa come una stringa semplice, non un'espressione regolare:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(In passato un argomento di sostituzione della stringa in gsub veniva convertito automaticamente in un'espressione regolare. So che era così nella versione 1.6. Non ricordo quale versione introdusse la modifica).
Come notato in altre risposte, puoi usare Regexp.new come alternativa all'interpolazione:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"