我一直在研究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|
但是,我不知道这是否是我想要使用的;我无法弄清楚如何使用它。
更新:我忘了将表格单元格放在代码中。
答案 0 :(得分:3)
Ruby的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>"
不要忘记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_tag
和link_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>"