Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

235
Visualizações
Rendimiento de Ruby ERB dentro de otra plantilla

Nota: No estoy usando rieles, sinatra o inclinación, solo el ERB incorporado de Ruby.

Supongamos que tengo dos archivos erb:

archivo1.erb:

 Start <%= yield if block_given? -%> End

y archivo2.erb:

 <% render('file1.erb') do %> Some text <% end %>

Me gustaría obtener una salida que se vea así:

 Start Some text End

Sin embargo, con el siguiente código ruby:

 require 'erb' def render(file) content = File.read(file) b = binding ERB.new(content, trim_mode: '-').result b end res = render('file2.erb')

Solo recibo "Algo de texto". Y si cambio la primera línea de file2.erb para usar <%= en lugar de <% , aparece un error de sintaxis:

 Traceback (most recent call last): 3: from test.rb:9:in `<main>' 2: from test.rb:6:in `render' 1: from /usr/lib/ruby/2.7.0/erb.rb:905:in `result' /usr/lib/ruby/2.7.0/erb.rb:905:in `eval': (erb):1: syntax error, unexpected ')' (SyntaxError) ...t.<<(( render('file1.erb') do ).to_s); _erbout.<< "\\n Some T... ... ^ (erb):3: syntax error, unexpected `end', expecting ')' ; end ; _erbout.<< "\\n".freeze ^~~ (erb):4: syntax error, unexpected end-of-input, expecting ')'

¿Hay alguna forma de hacer que esto funcione con el módulo 'erb'?

Puedo hacer que el rendimiento funcione si uso un bloque que devuelve una expresión directamente, pero eso no funcionará en mi caso.

Otra respuesta tiene una solución en la que el código de llamada puede representar una plantilla dentro de un diseño diferente. Pero eso realmente no funciona para mí, porque necesito definir el diseño para usar dentro de la plantilla (no hay realmente un equivalente de un controlador en mi código).

Pensé en hacer algo como cambiar .result a .run y ejecutarlo así:

 $stdout = outstream render('file2.erb')

Pero por alguna razón los resultados en la salida:

 Start Some Text End Some Text

Tenga en cuenta el "Algo de texto" adicional al final.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Como ya señaló, dado que no estamos generando el valor de retorno del método de render con <%= , en el primer caso solo obtenemos Some text en la salida, el resto solo se usa en el procesamiento.

En segundo lugar, cuando usó run con plantilla, lo que hace que el result se ejecute dos veces, la primera vez para la template que se llama en el primer archivo de script y luego la segunda vez para la template que se llama dentro file2.erb render .

Para resolver el problema, puede capturar la salida en una variable y luego imprimir la salida de la variable capturada como se muestra a continuación:

archivo2.erb

 <% @result = render('file1.erb') do -%> <% "Some text\n" -%> <% end -%> <%= @result -%>

Producción

 Start Some Text End

Nota: puede usar HEREDOC para colocar una gran cantidad de texto entre <% -%>

 <% @result = render('file1.erb') do -%> <% <<~EOF Some Text EOF -%> <% end -%> <%= @result -%>
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda