Ruby on rails Ruby,限制每个请求使用Find模块返回的文件数
我有一个控制器,它调用find_photos方法,向它传递一个查询字符串(文件名)Ruby on rails Ruby,限制每个请求使用Find模块返回的文件数,ruby-on-rails,ruby,file,Ruby On Rails,Ruby,File,我有一个控制器,它调用find_photos方法,向它传递一个查询字符串(文件名) class BrandingPhoto循环内 ,不太难做你想要的,但是你需要考虑如何处理页面加载、文件名与UTF-8或Unicode字符以及嵌入/父目录之间添加或删除的条目。 这是你所说的基础的老校规: require 'erb' require 'sinatra' get '/list_photos' do dir = params[ :dir ] offset = params[ :o
class BrandingPhoto found_photos对于这个问题,首先想到的是在退出循环后减少阵列。尽管另一种解决方案可能是为数组viz的大小添加一个分隔符,但这对于大量文件来说并不能很好地工作<代码>如果Buff.Posi.Studio长度>10 /代码>循环内 ,不太难做你想要的,但是你需要考虑如何处理页面加载、文件名与UTF-8或Unicode字符以及嵌入/父目录之间添加或删除的条目。
这是你所说的基础的老校规:
require 'erb'
require 'sinatra'
get '/list_photos' do
dir = params[ :dir ]
offset = params[ :offset ].to_i
num = params[ :num ].to_i
files = Dir.entries(dir).reject{ |fn| fn[/^\./] || File.directory?(File.join(dir, fn)) }
total_files = files.size
prev_a = next_a = ''
if (offset > 0)
prev_a = "<a href='/list_photos?dir=#{ dir }&num=#{ num }&offset=#{ [ 0, offset - num ].max }'><< Previous</a>"
end
if (offset < total_files)
next_a = "<a href='/list_photos?dir=#{ dir }&num=#{ num }&offset=#{ [ total_files, offset + num ].min }'>Next >></a>"
end
files_to_display = files[offset, num]
template = ERB.new <<EOF
<html>
<head></head>
<body>
<table>
<% files_to_display.each do |f| %>
<tr><td><%= f %></td></tr>
<% end %>
</table>
<%= prev_a %> | <%= total_files %> files | <%= next_a %>
</body>
</html>
EOF
content_type 'text/html'
template.result(binding)
end
在浏览器中,使用如下URL连接到正在运行的Sinatra服务器:
http://hostname:4567/list_photos?dir=/path/to/image/files&num=10&offset=0
我使用Sinatra是为了方便,但是常规的勇气是你想要什么的基础。如何将其转换为Rails术语留给读者作为练习。您能为您正在寻找的行为编写一些测试/规范吗?您希望如何调用此方法?你将如何从你离开的地方继续下去?它有助于在规范中设计API,然后从那里开始工作。还可以看看Ruby的API,了解Ruby本身可以实现的功能。我看你可以用Enumerable中的方法将代码精简到一行,我想不出一个简单的方法来实现这一点。您可能希望将该发现封装在自己的类中,该类将记录目录列表并实现分页。你可以让它记忆一段时间,或者实现一种注册新图像的方法。如果需要这样做,最好将图像元数据存储在数据库中。您可能想查看用于图像管理的和gems。
ruby test.rb
http://hostname:4567/list_photos?dir=/path/to/image/files&num=10&offset=0