I expected the puts statement to output 7, but it outputs the code
literally as #{(3+4).to_s}
How can i get this substitution to happen?
thanks for your help.
(Caveat: relatively new to Ruby)
I think it’s more trouble than it’s worth, though I don’t doubt it could
be done with some insane escaping and eval. I’d have to guess that the
#{}
expansion is done somewhere in the parser (?).
I recently made use of ERB (included with 1.8.3, don’t know about other
versions) for this kind of thing, which worked a treat. Your file would
contain something like:
<%= 3+4.to_s %>
(P.s. I know it looks a little bit /.*ML/ but it’s not specifically -
it’s
just the way ERB separates the code.
I had assumed that it would be possible to convert a single quote
string to a double quote string and that would take care of it. Is
that not possible. Maybe I’m looking at this the wrong way.
Substitution is done with the syntax you mention in my current version
of Rails. Is ERB what they use?
I had assumed that it would be possible to convert a single quote
string to a double quote string and that would take care of it. Is
that not possible. Maybe I’m looking at this the wrong way.
Substitution is done with the syntax you mention in my current version
of Rails. Is ERB what they use?
It is probably possible, maybe using the special quoting operators and
so
forth, but I imagine it is messy and problematic (?).
There appears to be some automagic escaping going on when # is read into
double quoted strings, or something like that.
Rails does use ERB, and I think I’d still suggest it. It’s ‘Embedded
Ruby’. With 1.8 it comes as standard (at least with 1.8.3). You can use
it
like:
require ‘erb’
sturf = [‘just’, ‘some’, ‘stuff’]
src = “<% sturf.length.times do |i| %><%= sturf[i] %> <% end %>”
text = ERB.new(src).result # => "just some stuff "
You can pass a binding to the ‘result’ method, so that you can do the
following:
require ‘erb’
class SomeClazz
def set_some_var
@foo = 'bar'
self
end
def render_text(s)
ERB.new(s).result(binding)
end
end
s = SomeClazz.new.set_some_var.render_text(‘<%= @foo %>’) # => “bar”
There is also a native version of ERB as a command - try ‘erb’ at your
prompt (I found it’s -x option quite helpful when debugging template
problems).