From: James Edward Gray II Date: 2005-12-10T12:16:46+09:00 Subject: Re: Customizing erb's recognized tags On Dec 9, 2005, at 8:58 PM, Larry White wrote: > i want to do a series of replacements on a file in two passes - one at > 'compile time', one at runtime. For a simple example, if i'm > creating 2 copies of a dynamic web page - one for each of two tables - > i would replace references to the table at 'compile time' and display > the particular values of a record from the table at runtime.It might > look like this > > > <% for column in #{table_name}.display_columns %> > <%= column.name %> > <% end %> > > > So i want to replace #{table_name} in the first pass and the rest of > the stuff in the second pass. Since there could be a large number of > replacements at either time, I thought a solution using erb with > different tag sets might be reasonably maintainable. My example pretty much works for that, with minor tweaks: >> template = <<'END' <% for column in #{table_name}.display_columns %> <%= column.name %> <% end %> END => "\n <% for column in \#{table_name}.display_columns %>\n <%= column.name %>\n <% end %>\n\n" >> table = Object.new => # >> class << table >> def display_columns >> names = %w{col_one col_two col_three} >> end >> end => nil >> class String >> def name; self end >> end => nil >> table_name = "table" => "table" >> template = eval(%Q{"#{template.gsub('"', '\\"')}"}, binding) => "\n <% for column in table.display_columns %>\n <%= column.name %>\n <% end %>\n\n" >> require "erb" => true >> ERB.new(template).result(binding) => "\n \n col_one\n \n col_two\n \n col_three\n \n\n" I wouldn't do it though. What's the harm of sticking the table name in a variable each tim before you run the template through ERb? Heck, run the templates like this: ERB.new(template).result(table.instance_eval { binding }) And then just call display_columns directly. Hope the helps. James Edward Gray II