2011-11-15 39 views
2

我想在Ruby中編寫一個方法,使用這裏的HTML代碼與輸入變量的文件,並相應地填充它們。紅寶石在這裏文件

我的方法是:

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變量填,運,右和結果。

例如,

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的值應該出現,左側和右側的值應填入value =「...」,結果應顯示在最後一行。

我是新來的紅寶石,但這是我自己在這裏的文檔的知識迄今所做的:

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

你可能想看看我開發的[dom gem](https://rubygems.org/gems/dom)。 – sawa

回答

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

對於ERB的簡單使用,我不知道你可以如此輕鬆地使用它。 –

1

最簡單的答案是定義並返回方法中的字符串,並使用參數名稱作爲插值變量。

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表達式的值。

+0

偉大的這很簡單,它似乎工作!如果你不介意,還有另一個問題。根據變量「op」的值,我需要在html標記中的「add」或「mul」之後添加字符串「selected」。我會如何去做這件事? – Shabu

+0

我編輯了我的答案來做你想做的事。基本上你可以在'#{}'裏放入任何ruby代碼,所以我把''選中'if op =='add''。根據具體情況,該表達式將評估爲「選定」或「無」。 –