ERB: doble evaluación?


#1

Hola RaiListeros,

Esta consulta és 100% ruby, siento si no es el sitio apropiado, pero
no he encontrado una lista en español sobre ruby solamente (al estilo
ruby-talk inglés)…

A lo que iba: Parte de mi proyecto consiste en generar ficheros de
configuración a base de templates (dhcpd.conf en este ejemplo). Tengo
pues dos ficheros ruby que me ayudan a generar el .conf:

gen_dhcp.rb (template a evaluar con erb), trozo de código:

(…)
<%= dhcp.generate_dynamic_zones %>

zone localdomain. {
primary <%= dhcp.dynamic_ranges[0].ip %>;
key rndc-key;
}
(…)

gen_dhcp_helper.rb (módulo con clases para separar la lógica del
template), ejemplo:

module GenDhcp

class Helper

attr_accessor :domain, :nameservers, :router, :dynamic_ranges

def initialize
  dhcp = YAML::load(File.open('conf_dhcp.yml'))

  # Shorter and YAML-independent attribute access
  @domain = dhcp['domain']
  @nameservers = dhcp['nameservers']
  @router = dhcp['router']

(…)

Ahora el problema/duda:

Dada la siguiente función definida en gen_dhcp_helper.rb:

def generate_dynamic_zones

  print <<-ZONES
    zone <%= dhcp.domain %> {
      primary <%= dhcp.dynamic_ranges[0].ip %>;
      key rndc-key;
    }

    zone <%= dhcp.dynamic_ranges[0].arpa %> {
      primary <%= dhcp.dynamic_ranges[0].ip %>;
      key rndc-key;
    }
  ZONES

end

Y llamada desde el template, cómo puedo indicar a ERB que evalue “en
dos pasadas” el HERE document ? Mi idea es que generate_dynamic_zones
deberia “pastear” el document y a continuación expandir las variables
que tiene dentro (dhcp.domain, por ejemplo).

He estado leyendo Bindings, Proc & ri ERB pero no veo cómo
solucionar-lo… quizà me esté complicando/liando demasiado ?

Gracias !


#2

On 07/02/07, brainstorm removed_email_address@domain.invalid wrote:

Hola RaiListeros,

Esta consulta és 100% ruby, siento si no es el sitio apropiado, pero
no he encontrado una lista en español sobre ruby solamente (al estilo
ruby-talk inglés)…

Solo quería aclarar que dado el volumen de la lista y la naturaleza de
Rails, opino que podemos acoger perfectamente las consultas sobre
Ruby. Así que totalmente on-topic.


Manuel
http://linkja.com * un agregador de tendencias
http://simplelogica.net
http://simplelogica.net/logicola


#3

Hola,

Perfecto entonces :slight_smile: Igualmente, ya lo he solucionado, ha sido
cuestión de leer un poquito más sobre ERB, probar con bindings y usar
las variables de instancia (@'s dentro de gen_dhcp_helper.rb), no la
instancia visible desde el template (gen_dhcp.rb):

def generate_dynamic_zones

  template = ERB.new <<-ZONES
  zone <%= @domain %> {
        primary <%= @dynamic_ranges[0].ip %>;
        key rndc-key;
      }

  zone <%= @dynamic_ranges[0].arpa %> {
        primary <%= @dynamic_ranges[0].ip %>;
        key rndc-key;
      }
  ZONES

  template.result(binding) # <--- !!!
end

end

Saludos & gracias igualmente por leerme :slight_smile:

PD: Curiosa la clase “Binding”… me recuerda demasiado a “Proc”…
imho, veo que hacen prácticamente lo mismo. Alguien me puede explicar
el porqué de esta diferenciación ?


#4

El Wednesday 07 February 2007 17:24:31 brainstorm escribió:

Hola RaiListeros,

Esta consulta és 100% ruby, siento si no es el sitio apropiado, pero
no he encontrado una lista en español sobre ruby solamente (al estilo
ruby-talk inglés)…

Pues sí que la hay: http://ruby.org.es/pages/lista :wink:

Un saludo.


Imobach González Sosa
correo-e: imobachgs en banot punto net
jabber id: osoh en jabberes punto org
web: http://www.banot.net/~osoh/
blog: http://devnull.blogs.banot.net/