如何在Ruby中定义for循环?

时间:2011-08-16 20:05:25

标签: php ruby-on-rails ruby-on-rails-3

我一直在研究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 个答案:

答案 0 :(得分:3)

Ruby的eacheach_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>"

不要忘记sanitize你的琴弦!

答案 1 :(得分:2)

你应该尝试更多地使用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_taglink_to,它们与map块结合使用 - 使您的代码更具可读性,并为您处理html转义。

答案 2 :(得分:0)

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>"