0

Sinatra 的答案似乎并不完全适用于古巴。我想将一个参数从 ruby​​ 环境传递给古巴的 erb。这是一个简化的测试,用于从路由环境传入最终代码中的对象数组。

这个简化的示例包括将“颜色”参数化定义为“红色”,但如果它没有设置为任何值,则在内部将其设置为绿色。如果未设置参数,目标代码将需要退出。按照当前设置,samp1 成功渲染了 erb 文件,但它是绿色的。问题解决为:我必须如何更改 app2.rb 中的 samp1(或任何 samp-n)才能将 sample.erb 中的“颜色”设置为红色?希望我可以抽象出答案,以便在全球范围内用于我的目的。请注意,其他 samp-n 是其他失败的尝试。

非常感谢您的帮助。

文件:

app2.rb:

require 'cuba' 
require 'erb' 
require 'cuba/render' 
require 'tilt/erubis'

Cuba.plugin Cuba::Render
Cuba.define do

# only GET requests   on get do

  # /samp1    
  on "samp1" do
    res.write render('sample.erb')
  end

  # /samp2
  on "samp2" do
    ns = OpenStruct.new(color: 'red')
    template = File.read('./sample.erb')
    res.write render(template).result(ns.instance_eval {binding})
  end

  # /samp3
  on "samp3" do
    ns = OpenStruct.new(color: 'red')
    template = File.read('./sample.erb')
    res.write erb(template).result(ns.instance_eval {binding})
  end

  # /samp4
  on "samp4" do
    locals = {}
    locals["color"]="red"
    res.write render('sample.erb',locals)
  end

  # /Cuba
  on Cuba do
     res.write "hello, Cuba!"
  end   end end

以及以下 config.ru:

require './app2'

run Cuba

最后,erb 文件 sample.erb:

<% 
   color = ARGV[0]
   color = "green" if color.nil?
%>   

<html>
  <head>
    <title>Square</title>
  </head>
  <body>
    <h1>Square</h1>

    <svg width="700" height="500"
       xmlns="http://www.w3.org/2000/svg" version="1.1">
      <desc>Sample Board</desc>

      <style type="text/css"> <![CDATA[
    rect.a {stroke:black; fill:<%=color%>}]]>
      </style>

      <rect class="a" x="100" y="50" width="200" height="200" stroke_width="10"/>
    </svg>
  </body>
</html>

文件结束

4

3 回答 3

2

查看lib/cuba/render.rb和渲染函数的签名:

def render(template, locals = {}, options = {}, &block)
    ...
end

所以,如果你只是在你的调用中给出一个哈希,它将是本地人:

res.write render("views/hello.erb", :foo => bar, ...)

您也可以明确表示:

res.write render("views/hello.erb", { :foo => bar, ... }, options_hash)

在http://github.com/danizen/cuba-erb-hello查看一个工作示例

于 2014-06-11T03:44:06.857 回答
0

在上面的答案中,1 处有一个错误。它应该显示为:“删除 <%= 和 %> 之间的 html 标记上方的所有材料”,但是当我输入答案时,我使用了括号中的标记。

于 2014-05-26T18:26:13.697 回答
0

我终于成功地让它工作了。在 app2.rb 文件中,我将 samp2 更改如下:

# /samp2
on "samp2" do
  res.write render('sample.erb', color: 'red', wid: '400')
end

这改变了颜色和宽度。但我还需要编辑“sample.erb”,如下所示:

  1. 删除上面的所有 <% .. %> 材料
  2. 保持 <:=color%> 不变。
  3. 将 ...width="200"... 更改为 ...width='<%=wid%>'...

我添加了宽度以确保解决方案能够很好地推广,并且确实如此。这表明任何对象或对象集都可以从 Ruby 传递到 erb。

于 2014-05-26T18:21:44.013 回答