On Sat, Feb 16, 2013 at 1:53 PM, David Unric <[email protected]> wrote:
> Hello,
>
> when trying to add tracing output to an erb template I hit the following
> issue when trying to find where variable ex_title comes from.

I cannot reproduce this issue

irb(main):001:0> e = ERB.new '(<%= x %>)'
=> #<ERB:0x802ae510 @safe_level=nil, @src="#coding:UTF-8\n_erbout =
''; _erbout.concat \"(\"; _erbout.concat(( x ).to_s); _erbout.concat
\")\"; _erbout.force_encoding(__ENCODING__)", @enc=#<Encoding:UTF-8>,
@filename=nil>
irb(main):002:0> x = 99
=> 99
irb(main):003:0> e.result binding
=> "(99)"

irb(main):004:0> e = ERB.new '(<%= x %>)(<%= local_variables.inspect
%>)(<%= local_variables.grep(/x/) %>)'
=> #<ERB:0x8029f8e4 @safe_level=nil, @src="#coding:UTF-8\n_erbout =
''; _erbout.concat \"(\"; _erbout.concat(( x ).to_s); _erbout.concat
\")(\"; _erbout.concat(( local_variables.inspect ).to_s);
_erbout.concat \")(\"; _erbout.concat(( local_variables.grep(/x/)
).to_s); _erbout.concat \")\"; _erbout.force_encoding(__ENCODING__)",
@enc=#<Encoding:UTF-8>, @filename=nil>
irb(main):005:0> e.result binding
=> "(99)([:_erbout, :x, :e, :_])([:x])"

Also outside IRB

$ ruby -r erb -e 'e=ERB.new("<%= x %>|<%= local_variables.sort.inspect
%>");x=99;puts e.result'
99|[:_erbout, :e, :x]
$ ruby -r erb -e 'e=ERB.new("<%= x %>|<%= local_variables.grep(/x/)
%>");x=99;puts e.result'
99|[:x]

> Tried to list all possible variables in the current scope, but there
> simply does not exists:
> <%= instance_variables.grep(/ex_title/) %>   # renders an empty array
> <%= global_variables..grep(/ex_title/) %>    # renders an empty array
> <%= local_variables..grep(/ex_title/) %>     # renders an empty array

Did you really execute this?  I get this

irb(main):008:0> f = ERB.new '<%= local_variables..grep(/x/) %>'
=> #<ERB:0x80253890 @safe_level=nil, @src="#coding:UTF-8\n_erbout =
''; _erbout.concat(( local_variables..grep(/x/) ).to_s);
_erbout.force_encoding(__ENCODING__)", @enc=#<Encoding:UTF-8>,
@filename=nil>
irb(main):009:0> f.result binding
NoMethodError: undefined method `grep' for main:Object
        from (erb):1
        from /usr/lib/ruby/1.9.1/erb.rb:838:in `eval'
        from /usr/lib/ruby/1.9.1/erb.rb:838:in `result'
        from (irb):9
        from /usr/bin/irb:12:in `<main>'

$ ruby -r erb -e 'e=ERB.new("<%= x %>|<%= local_variables..grep(/x/)
%>");x=99;puts e.result'
(erb):1:in `<main>': undefined method `grep' for main:Object (NoMethodError)
        from /usr/lib/ruby/1.9.1/erb.rb:838:in `eval'
        from /usr/lib/ruby/1.9.1/erb.rb:838:in `result'
        from -e:1:in `<main>'


If I omit the second dot I get

irb(main):010:0> f = ERB.new '<%= local_variables.grep(/x/) %>'
=> #<ERB:0x8022ed4c @safe_level=nil, @src="#coding:UTF-8\n_erbout =
''; _erbout.concat(( local_variables.grep(/x/) ).to_s);
_erbout.force_encoding(__ENCODING__)", @enc=#<Encoding:UTF-8>,
@filename=nil>
irb(main):011:0> f.result binding
=> "[:x]"


> <%= instance_variables.sort %>   # renders array with many elements
> <%= global_variables.sort %>     # renders array with many elements
> <%= local_variables.sort %>      # renders array with many elements
>
> Whereas ex_title variable provably does exists:
> <%= ex_title %>                  # renders value "Categories - Online
> store"
> <%= ex_title.class %>            # renders "String"
> <%= ex_title.object_id %>        # renders "15825900"
>
> Where else can be found if not in global, local or instance variables ?

You would have to show us how you evaluate those ERB templates.

Cheers

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

-- 
[email protected] | 
https://groups.google.com/d/forum/ruby-talk-google?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"ruby-talk-google" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to