Как определить цикл for в Ruby? - PullRequest
0 голосов
/ 17 августа 2011

Я смотрел на ruby-docs, но не смог понять их.У меня есть приложение, которое генерирует таблицу и хранит файлы в каждой ячейке, пользователь может добавить другой файл, нажав на последнее поле с надписью «Добавить файл», но я не могу понять, как это сделать в ruby.

В PHP я бы сделал что-то вроде этого;если это поможет кому-нибудь понять:

for($i = 0; $i <= $file_array.size; $i++){
  if($i%3=0){
   html .= "</tr><tr>"
  }
  if($i == $array.size){
   //Prevents out of bounds error
   html .= "<td><a href=\"...\">New File Link</a></td>"
  }
 else{
  //We are not out-of-bounds; continue.
  html .= "<td><a href=\"$file_array[$i]\">File Link</a></td>"
 }
}

В рубине у меня есть

 object.files.each_with_index |attachment, i|

, но я не знаю, хочу ли я это использовать;Я не могу понять, как его использовать.

Обновление: Я забыл поместить в код ячейки таблицы.

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

Ruby's each и each_with_index напоминают цикл PHP foreach.Переменная attachment будет элементом массива:

html = ""
object.files.each_with_index do |attachment, i|
  html << "</tr><tr>" if i % 3 == 0
  html << "<a href=\"#{attachment}\">File Link</a>"
end
html << "<a href=\"...\">New File Link</a>"

И не забудьте очистить ваши строки!

2 голосов
/ 22 августа 2011

Вы должны попытаться более широко использовать функциональные подходы в ruby, а не пытаться сделать это способом PHP ... Вот такой подход я бы попробовал:

# make all file links into a new array converted to html code, append
# a "new file" link
files = object.files.map {|link| '<a href="%s">File Link</a>' % link }
files << ('<a href="%s">New File Link</a>' % "...")

# now break this into slices of 3 wrapped with <td>
files = files.each_slice(3).map {|tr| tr.map {|td| "<td>#{td}</td>" }.join }

# now wrap the rows with <tr>
files = files.map {|tr| "<tr>#{tr}</tr>" }.join

Это может выглядеть сложнымно я думаю, что он показывает возможности и мощь функций отображения и параметров блока, код чище с использованием меньшего количества вспомогательных переменных, и он ИМХО более читабелен / понятен.И самое лучшее: он устраняет черную магию, необходимую для обработки новой ссылки на файл, которую почти никто не понимает, когда впервые смотрит на цикл for.

Кстати: я думаю, что вы используете Rails, хотя ваш вопрос задан для Rubyв общемЯ бы порекомендовал взглянуть на помощники content_tag и link_to, которые - в сочетании с блоками map - сделают ваш код еще более читабельным и будут обрабатывать html-экранирование для вас.

0 голосов
/ 17 августа 2011
html = ""
object.files.each_slice(3) do |files|
  html << "<tr>"
  files.each do |attachment|
    html << "<a href=\"#{attachment}\">File Link</a>"
  end
  html << "</tr>"
end
html << "<a href=\"...\">New File Link</a>"
...