2011-11-15 6 views
2

私は、入力変数を持つHTMLコードのhere-documentを使用し、それに応じてそれらを埋め込むメソッドをRubyに書き込もうとしています。ruby​​ here documents

私の方法は次のとおりです。私は使用しています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="?????"> 
= 
????? 

はどこでも疑問が私の方法は、左の変数で埋めるために持っているマークし、OP、右、そして結果があります

calcForm(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** 

ので、「選択」という言葉は、オペアンプの値に応じて「追加」または「7月」の後に表示されます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のメソッドを上のドキュメントに接続する方法を混乱させる。

これに関するお手伝いをさせていただきますようお願い申し上げます。

ありがとうございました!

+0

私が開発した[dom gem](https://rubygems.org/gems/dom)を調べるとよいでしょう。 – sawa

答えて

10

文字列補間を組み込んで一度定義して再利用すると、ヘドラックをテンプレートの一種として考えているようです。そうではありません。任意の文字列定義と同様に、文字列補間は、変数が定義されたときにその場で行われます。

だからあなただけの

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、あるかもしれないだろう。すなわちテンプレートである。ここbindingは、「現在のコンテキスト内での発現を評価する」という意味魔法の言葉であることを

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 

注意。つまり、現在定義されている変数(渡されたパラメータ)を使用します。

+1

+1 ERBの簡単な使用のために、私はあなたがそう簡単にそれを使用することができるか分からなかった。 –

1

最も簡単な答えは、メソッド内の文字列を定義して返し、パラメータ名を補間変数として使用することです。

0

これは動作するはずです:私はHTMLの検証を支援するために、あなたの属性の周りにいくつかの引用符を追加しました

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 

returnを明示的に記述するか、ローカル変数を宣言する必要はありません。メソッドの戻り値は常に最後のルビ表現の値になるからです。

+0

これは簡単で、うまくいくようです!あなたが気にしないなら、まだ別の素早い質問があります。変数 "op"の値に応じて、htmlタグに "add"または "mul"の後に文字列 "selected"を追加する必要があります。これをどうやってやりますか? – Shabu

+0

私はあなたが望むことをするために私の答えを編集しました。基本的に '#{}'の中に任意のルビコードを置くことができるので、op == 'add'なら 'selected 'を指定します。この式は状況に応じて '' selected''または 'nil'のいずれかと評価されます。 –