O código que você acha que não funciona:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
As coisas ficam mais interessantes se var puder conter metacaracteres de expressão regular. Se isso acontecer e você quiser que esses caracteres matemáticos façam o que costumam fazer em uma expressão regular, o mesmo GSUB funcionará:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
No entanto, se sua string de pesquisa contiver metacaracteres e você não quiser que eles sejam interpretados como metacaracteres, use Regexp.escape assim:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Ou apenas dê ao gsub uma string em vez de uma expressão regular. Em MRI> = 1.8.7, gsub tratará um argumento de substituição de string como uma string simples, não uma expressão regular:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(Antigamente, um argumento de substituição de string para gsub era automaticamente convertido em uma expressão regular. Eu sei que era assim no 1.6. Não me lembro qual versão introduziu a mudança).
Conforme observado em outras respostas, você pode usar Regexp.new como uma alternativa à interpolação:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"