рубиновые документы - PullRequest
       3

рубиновые документы

2 голосов
/ 15 ноября 2011

Я пытаюсь написать метод на 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, 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**

Таким образом, слово «selected» должно появляться после «add» или «jul» в зависимости от значения op, значения 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 к приведенному выше документу.

Любая помощь с этим будет принята с благодарностью!

Спасибо!

Ответы [ 3 ]

10 голосов
/ 15 ноября 2011

Похоже, вы думаете о 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 голос
/ 15 ноября 2011

Самый простой ответ - определить и вернуть строку внутри вашего метода и использовать имена параметров в качестве переменных интерполяции.

0 голосов
/ 15 ноября 2011

Это должно работать:

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.

...