【问题标题】:ruby here documents红宝石这里的文件
【发布时间】:2011-12-29 05:07:21
【问题描述】:

我正在尝试在 Ruby 中编写一个方法,该方法使用带有输入变量的 HTML 代码的 here-document 并相应地填充它们。

我的方法是:

calcForm(left, op, right, result)

我使用的html标签是

<input type="text" name="left" value="?????"> 
<select name="op">
<option value="add" ?????>+</option>
<option value="mul" ?????>*</option> 
</select>
<input type="text" name="right" value="?????"> 
=
?????

到处都是问号,我的方法必须用变量 left、op、right 和 result 填写。

例如,

calcForm(6, "mul", 7, 42) 

应该返回字符串:

<input type="text" name="left" value="**6**"> 
<select name="op">
<option value="add">+</option>
<option value="mul" **selected**>*</option> 
</select>
<input type="text" name="right" value="**7**"> 
=
**42**

所以,根据 op 的值,“add”或“jul”之后应该出现“selected”这个词,left 和 right 的值应该填入 value="...",结果应该出现在最后一行。

我是 ruby​​ 的新手,但这是我迄今为止对这里文档的了解所做的:

the_tags = <<HERE
<input type="text" name="left" value=#{left}> 
<select name="op">
<option value="add" #{op}>+</option>
<option value="mul" #{op}>*</option> 
</select>
<input type="text" name="right" value=#{right}> 
=
#{result}
HERE

def calcForm(left,op,right,result)

我被困在这一点上。我对如何将我的方法 calcForm 连接到上面的此处文档感到困惑。

对此的任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 你可能想看看我开发的dom gem

标签: ruby string heredoc string-interpolation


【解决方案1】:

看起来您将heredoc 视为一种模板,您定义一次,内置字符串插值,然后重用。它不是。与任何字符串定义一样,字符串插值在定义变量时即时发生。

所以你会这样做

def calcForm(left,op,right,result)
   <<HERE
     <input type="text" name="left" value=#{left}> 
     <select name="op">
     <option value="add" #{op}>+</option>
     <option value="mul" #{op}>*</option> 
     </select>
     <input type="text" name="right" value=#{right}> 
     =
     #{result}
   HERE
end

但是,对于您正在尝试做的事情,一个更好的方法可能是ERB,它更像您上面的想法;即它是一个模板。

require 'erb'
template = ERB.new <<HERE
         <input type="text" name="left" value=<%=left%>> 
         <select name="op">
         <option value="add" <%=op%>>+</option>
         <option value="mul" <%=op%>>*</option> 
         </select>
         <input type="text" name="right" value=<%=right%>> 
         =
         <%=result%>
         HERE

def calcForm(left,op,right,result)
   template.result(binding)    
end

注意binding这里是一个神奇的词,意思是“评估当前上下文中的表达式”;即使用当前定义的变量(传入的参数)。

【讨论】:

  • ERB 的简单使用+1,没想到你可以这么轻松使用。
【解决方案2】:

最简单的答案是在方法中定义并返回字符串,并使用参数名称作为插值变量。

【讨论】:

    【解决方案3】:

    这应该可行:

    def calcForm(left,op,right,result)
      <<HERE
    <input type="text" name="left" value="#{left}"> 
    <select name="op">
    <option value="add" #{'selected' if op == 'add'}>+</option>
    <option value="mul" #{'selected' if op == 'mul'}>*</option> 
    </select>
    <input type="text" name="right" value="#{right}"> 
    =
    #{result}
    HERE
    end
    

    我在您的属性周围添加了一些引号以帮助进行 HTML 验证。您无需显式编写return 或声明局部变量,因为该方法的返回值将始终是最后一个 ruby​​ 表达式的值。

    【讨论】:

    • 太棒了,这很简单,而且似乎有效!如果您不介意,还有另一个问题。根据变量“op”的值,我需要在 html 标记中的“add”或“mul”之后添加字符串“selected”。我该怎么做呢?
    • 我已经编辑了我的答案来做你想做的事。基本上你可以在#{} 中放任何ruby 代码,所以我放'selected' if op == 'add'。此表达式将根据具体情况计算为 'selected'nil
    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多