2012-02-29 13 views
22

Napisałem formularz internetowy wykorzystujący Sinatrę i Haml, które będą używane do wywoływania skryptu w języku Ruby.Jak przekazać argument podczas wywoływania pliku widoku?

Wszystko wydaje się w porządku, z wyjątkiem jednej rzeczy: muszę przekazać argument do pliku widoku Haml ze skryptu Sinatra/Ruby.

Tutaj jest część mojego kodu:

#!/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 

Jeśli skrypt napotka arror zwróci ciąg zawierającej słowo „Error”. Jeśli tak się stanie, dzwonię do pliku Haml, który wyświetli stronę błędu dla użytkowników. Jeśli skrypt nie natrafi na arror, zwróci stronę sukcesu.

Chcę dodać na stronie powodzenie/niepowodzenie nazwę nowej maszyny wirtualnej dodanej przez użytkownika. Mój problem polega na tym, że nie mam pojęcia, jak go przekazać w obu moich plikach Haml. Szukałem rozwiązania, ale niczego nie znalazłem.

Odpowiedz

33

można przekazać hash parametrów do metody haml pomocą klawisza :locals:

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

ten sposób kod Ruby w pliku haml może uzyskać dostęp some_object i uczynić cokolwiek treść jest tam, metody połączeń itp .

+0

Działa doskonale, dziękuję bardzo dużo (głosowało w górę!) – Cocotton

+0

Czy to też działa dla układu? Jeśli mam 'haml: index,: layout =>: common_layout,: locals => {: object => my_object}', czy zmienna lokalna 'object' zostanie zdefiniowana w szablonie' common_layout'? – Alexey

1

Given

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

bym spróbować

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

Haml obsługuje przekazywanie zmiennych jako locals. Z Sinatra, można wysłać te mieszkańców tak:

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

iw widoku, odwoływać się do zmiennej przy użyciu locals[:vm_name] lub po prostu vm_name.

+0

To samo, co gre powiedział, nadal dziękuję (głosowali w górę!) – Cocotton

+0

Działa zgodnie z oczekiwaniami. Dzięki @ sgtFlot – harsha

4

Robię to w Sinatra + Markaby, myślę, że powinno być to samo z haml:

w Ruby skryptu: @var = 'foo'

W szablonie: User name: #{@var}