2012-02-29 10 views
22

Escribí un formulario web usando Sinatra y Haml que se usará para llamar a un script de Ruby.¿Cómo pasar un argumento al llamar a un archivo de vista?

Todo parece correcto excepto por una cosa: necesito pasar un argumento a un archivo de vista de Haml del script de Sinatra/Ruby.

Aquí es una parte de mi código:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'sinatra' 
require 'haml' 

get '/' do 
    haml :index 
end 

post '/' do 
    name = params[:name] 
    vlan = params[:vlan] 

    tmp = nil 
    tmp = %x[./wco-hosts.rb -a -n #{name} -v #{vlan}] 

    if tmp.include?("Error") 
    haml :fail 
    else 
    haml :success 
    end 
end 

Si el script se encuentra con un arror se devolverá una cadena que incluye la palabra "error". Si esto sucede, estoy llamando a un archivo Haml que mostrará una página de error a los usuarios. Si el script no encuentra un arror, devolverá una página de éxito.

Quiero incluir, en la página de éxito/falla, el nombre de la nueva máquina virtual que el usuario agregó. Mi problema es que no tengo ni idea de cómo pasarlo en mis dos archivos de Haml. Busqué una solución, pero no encontré nada.

Respuesta

33

Puede pasar un hash de parámetros al método Haml usando la tecla :locals:

get '/' do 
    haml :index, :locals => {:some_object => some_object} 
end 

De esta manera el código Ruby en su archivo Haml puede acceder some_object y hacer que de los contenidos allí, los métodos de llamadas, etc. .

+0

funcionando perfectamente, muchas gracias mucho (votaron!) – Cocotton

+0

¿Funcionará esto también para un diseño? Si tengo 'haml: index,: layout =>: common_layout,: locals => {: object => my_object}', ¿la variable local 'object' se definirá en la plantilla' common_layout'? – Alexey

1

Dada

haml(template, options = {}, locals = {}) 

que iba a tratar

haml :success, {}, {my_var: my_value} 
7

Haml admite pasar variables como locales. Con Sinatra, puede enviar estos locales, así:

haml :fail, :locals => {:vm_name => name} 

y en la vista, hacer referencia a la variable usando locals[:vm_name] o simplemente vm_name.

+0

Lo mismo que gre dijo, aún gracias (votaron!) – Cocotton

+0

Funciona como se esperaba. Gracias @sgtFlot – harsha

4

que estoy haciendo esto en Sinatra + Markaby, creo que debe ser la misma con Haml:

En el guión Ruby: @var = 'foo'

En plantilla: User name: #{@var}

Cuestiones relacionadas