2012-02-29 31 views
22

Tôi đã viết một biểu mẫu web sử dụng Sinatra và Haml sẽ được sử dụng để gọi một tập lệnh Ruby.Làm thế nào để vượt qua một đối số khi gọi một tập tin xem?

Mọi thứ có vẻ tốt ngoại trừ một điều: Tôi cần chuyển một đối số cho tệp xem Haml từ tập lệnh Sinatra/Ruby.

Đây là một phần của mã của tôi:

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

Nếu kịch bản gặp một arror nó sẽ trả về một chuỗi bao gồm từ "Lỗi". Nếu điều này xảy ra, tôi sẽ gọi một tệp Haml sẽ hiển thị trang lỗi cho người dùng. Nếu tập lệnh không gặp lỗi, nó sẽ trả về trang thành công.

Tôi muốn bao gồm, trong trang thành công/lỗi, tên của máy ảo mới mà người dùng đã thêm. Vấn đề của tôi là tôi không có đầu mối làm thế nào để vượt qua nó trong cả hai tập tin Haml của tôi. Tôi đã tìm kiếm một giải pháp, nhưng không tìm thấy gì cả.

Trả lời

33

Bạn có thể vượt qua một hash của tham số để phương pháp Haml sử dụng :locals chính:

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

Bằng cách này, mã Ruby trong tập tin Haml của bạn có thể truy cập some_object và đưa ra bất cứ nội dung trong đó, phương pháp gọi vv

+0

Làm việc một cách hoàn hảo, cảm ơn bạn rất nhiều (đã bỏ phiếu!) – Cocotton

+0

Điều này cũng có tác dụng cho bố cục không? Nếu tôi có 'haml: index,: layout =>: common_layout,: locals => {: object => my_object}', biến cục bộ 'object' có được định nghĩa trong mẫu' common_layout' không? – Alexey

1

Với

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

. tôi muốn thử

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

Haml hỗ trợ các biến vượt qua làm người dân địa phương. Với Sinatra, bạn có thể gửi những người dân địa phương như sau:

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

và trong giao diện, tham khảo các biến sử dụng locals[:vm_name] hoặc đơn giản là vm_name.

+0

Điều tương tự như gre đã nói, vẫn cảm ơn bạn (đã bỏ phiếu!) – Cocotton

+0

Hoạt động như mong đợi. Cảm ơn @sgtFlot – harsha

4

tôi đang làm điều này trong Sinatra + Markaby, tôi nghĩ rằng nó nên được như vậy với Haml:

Trong Ruby kịch bản: @var = 'foo'

Trong mẫu: User name: #{@var}

Các vấn đề liên quan