Sinatra的答案似乎并不完全适用于古巴。我想将参数从红宝石环境传递到古巴的erb。这是一个简化的测试,用于从路由环境传入最终代码中的对象数组。
这个简化的样本包括参数化定义颜色'要是"红色",但如果没有设置为任何东西,那么在内部它会被设置为绿色。如果未设置参数,目标代码将需要挽救。按照当前设置,samp1成功呈现erb文件,但它是绿色的。问题解决为:如何在app2.rb中更改samp1(或任何样本)以设置颜色'在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>
文件结尾
答案 0 :(得分: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)
上的工作示例
答案 1 :(得分:0)
我终于成功地使它成功了。在文件app2.rb中,我更改了samp2,如下所示:
# /samp2
on "samp2" do
res.write render('sample.erb', color: 'red', wid: '400')
end
这改变了颜色和宽度。但我还需要编辑&#39; sample.erb&#39;如下:
我添加了宽度以确保解决方案能够很好地完成,并且确实如此。这表明任何对象或对象集都可以从Ruby传递给erb。
答案 2 :(得分:0)
在上面的答案中,错误为1。 它应显示为:“删除&lt;%=和%&gt;”之间的html标记上方的所有材料,但是当我输入答案时,我使用了括号标记。