【问题标题】:How to pass an argument when calling a view file?调用视图文件时如何传递参数?
【发布时间】:2012-03-19 05:34:47
【问题描述】:

我使用 Sinatra 和 Haml 编写了一个用于调用 Ruby 脚本的网络表单。

一切似乎都很好,除了一件事:我需要将参数从 Sinatra/Ruby 脚本传递给 Haml 视图文件。

这是我的代码的一部分:

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

如果脚本遇到错误,它将返回一个包含单词“Error”的字符串。如果发生这种情况,我将调用一个 Haml 文件,该文件将向用户显示错误页面。如果脚本没有遇到错误,它将返回一个成功页面。

我想在成功/失败页面中包含用户添加的新 VM 的名称。我的问题是我不知道如何在我的两个 Haml 文件中传递它。我搜索了一个解决方案,但没有找到任何东西。

【问题讨论】:

    标签: ruby sinatra haml


    【解决方案1】:

    您可以使用 :locals 键将参数哈希传递给 Haml 方法:

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

    这样,您的 Haml 文件中的 Ruby 代码可以访问 some_object 并呈现其中的任何内容、调用方法等。

    【讨论】:

    • 这也适用于布局吗?如果我有haml :index, :layout => :common_layout, :locals => { :object => my_object },会在common_layout 模板中定义object 局部变量吗?
    【解决方案2】:

    Haml 支持将变量作为局部变量传递。使用 Sinatra,您可以像这样发送这些本地人:

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

    在视图中,使用locals[:vm_name] 或简单的vm_name 引用变量。

    【讨论】:

    • 按预期工作。谢谢@sgtFlot
    【解决方案3】:

    我在 Sinatra+Markaby 中这样做,我认为应该与 Haml 相同:

    在 Ruby 脚本中:@var = 'foo'

    在模板中:User name: #{@var}

    【讨论】:

      【解决方案4】:

      给定

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

      我会试试

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        相关资源
        最近更新 更多