【问题标题】:More on passing parameters to erb in Cuba更多关于在古巴将参数传递给 erb
【发布时间】:2014-05-22 05:13:07
【问题描述】:

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>

文件结束

【问题讨论】:

    标签: ruby rendering erb cuba


    【解决方案1】:

    lib/cuba/render.rb和render函数的签名:

    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查看一个工作示例

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        在上面的答案中,1 处有错误。 它应该是:“删除 之间的 html 标签上方的所有材料”,但是当我输入答案时,我使用了括号内的标签。

        【讨论】:

        • 您应该编辑您的原始答案,而不是发布引用“上述答案”的新答案。
        猜你喜欢
        • 2011-10-07
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 2018-12-27
        • 2016-02-25
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        相关资源
        最近更新 更多