我正在尝试在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**
所以,“选择”这个词应该出现在“add”或“jul”之后,取决于op的值,左边和右边的值应该填入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连接到上面的here文档。
对此有任何帮助将不胜感激!
谢谢!
答案 0 :(得分:10)
看起来你正在考虑将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
这里是一个神奇的词,意思是“评估当前上下文中的表达式”;即使用当前定义的变量(传入的参数)。
答案 1 :(得分:1)
最简单的答案是在方法中定义并返回字符串,并使用参数名作为插值变量。
答案 2 :(得分:0)
这应该有效:
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表达式的值。