Hi David,

David B. wrote:
> require 'find'
> result = []
> @pattern = '*.html'
> Find.find('public/2008/') do |p|
>   next unless File.file?(p)
>   name = File.basename(p)
>   result << p if File.fnmatch(@pattern, name)
> end

No need for 'find'.  A simple 'glob' suffices:

files = Dir[File.join('public/2008/', '**', @pattern)]

David B. wrote:
> a = ''
> result.length.times do |i|
>   content = File.read(result[i])
>   a += '<div class="article">'
>   a += content
>   a += '<address>' + File.ctime(result[i]).to_s + '</address>'
>   a += '</div>'
> end
> a

Iterating over an array like this is kind of cumbersome.  'each' should 
be your weapon of choice here.  Furthermore using the << operator for 
concatenation could yield in better performance as += constructs a new 
String object whereas << doesn't (AFAIK).

David B. wrote:
> As you can see, it display some articles in a webpage. However, but I
> would like to order them by time (with File.ctime(result[i]) for
> instance) such as in blogs. If you see a sexy way to do so, that would
> be very helpful for me.

Hope that's sexy enough for you:

result = result.sort_by { |p| File.ctime(p) }

To sum it all up here is how I would have done it:

---
@dir = 'public/2008'
@pattern = '*.html'

files = Dir[File.join(@dir, '**', @pattern)].select { |f| File.file?(f) 
}
files = files.sort_by { |f| File.ctime(f) }

a = ''
files.each do |f|
  a << '<div class="article">'
  a << File.read(f)
  a << '<address>' + File.ctime(f).to_s + '</address>'
  a << '</div>'
end
a
---

Hope that helps!

Regards,
Matthias
-- 
Posted via http://www.ruby-forum.com/.