2

入力変数を含むHTMLコードのヒアドキュメントを使用し、それに応じて入力するメソッドをRubyで作成しようとしています。

私の方法は:

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」という単語が表示され、左右の値が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を上記のヒアドキュメントに接続する方法に混乱しています。

これに関する助けをいただければ幸いです。

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

4

3 に答える 3

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である可能性があります。これは、上記で考えていたものとよりよく似ています。つまり、それはテンプレートです。

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これは「現在のコンテキストで式を評価する」という意味の魔法の言葉であることに注意してください。つまり、現在定義されている変数(渡されたパラメーター)を使用します。

于 2011-11-15T04:48:35.220 に答える
1

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

于 2011-11-15T04:45:29.997 に答える
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式の値になるため、ローカル変数を明示的に記述したり宣言したりする必要はありません。

于 2011-11-15T04:49:58.313 に答える