What have you found for these years?

2008-06-19

RailsFieldsFilters

(所有程式 licensed under Apache License 2.0, see ludy.)

目的是在文章儲存前,先做一些額外的處理再存進去。
一直擴充下去最後就變這樣了,大概是做到這種感覺:

require 'rails_fields_filters'
require 'xhtml_formatter'

class Article < ActiveRecord::Base
extend RailsFieldsFilters
# before_save 時,對 content 做 format_autolink.
rff_filters[:before_save] << [:content, XhtmlFormatter.method(:format_autolink)]
# before_save 時,對 author 做 titileize
rff_filters[:before_save] << [:author, :titleize.to_proc]

# after_save 時,對 author 做 reverse 再做 downcase.
rff_filters[:after_save] << [:author, [:reverse.to_proc, :downcase.to_proc]]

# after_save 時,對 content 和 author 做 format_article,
# 下面那一串是允許的 tag. 其他所有的 tag 都會 escape 掉。(只 escape <)
# 有針對 pre 做處理,所有 \r\n, \n, \r 全部轉換成 br, 除了 pre 之內
rff_filters[:after_save] << [
[:content, :author],
lambda{ |input|
XhtmlFormatter.format_article input,
:a, :pre, :object, :img, :b, :strong, :em, :li, :ul, :ol, :i
}
]

rff_setup
end


詳細測試程式看這吧:test/ludy/test_rails_fields_filters.rb

實作很短:
module Ludy
module RailsFieldsFilters
def rff_filters
@rff_filters ||= Hash.new{|h,k|h[k]=[]}
end
def rff_setup
rff_filters.each{ |event, tasks|
tasks.each{ |task|
fields, filters = task
__send__ event, lambda{ |record|
[fields].flatten.each{ |field|
record.__send__ "#{field}=",
[filters].flatten.inject(record.__send__(field)){ |result, filter|
filter[result]
}
}
}
}
}
end
end
end


xhtml_formatter 比較長,看外部連結吧:lib/ludy/xhtml_formatter.rb

用到了 hpricot 來修復和分析 (x)html,
這是前一陣子寫好的,有一小段時間了。

主角 RailsFieldsFilters 其實一開始寫得很長,
應該有接近百行吧?功能還不怎麼多哩...
後來一直修最後就只剩 20 行,彈性還是最強的 @_@

平均每小時程式碼行數產量應該是負的吧|||b
寫程式還停留在 if else 是不行的啊

另外想抱怨的是,active support 用掉了 Proc#bind 這個名字,
害我的 test case 只要一 require 到他就會掛掉。 :(
也許這是無解的問題,短時間內... 超級 namespace 的機制,
就算在 ruby 2.0 可能也不會加進去(聽說,因為太複雜了)。

對了,還有一件事。更新到 ruby 1.8.7 之後,
我 rails 相關的 test case 要花 2~3 倍的時間!?
真不曉得為什麼?難道是 1.8.7 效能差很多嗎?
還是 rails 的程式對 1.8.6 tune 過,所以 1.8.7 就會慢??
因為我跑其他 test case 好像並不會說比較慢?存疑,懶得求證了...

2 retries:

Hinoris said...

筆電可以貴到這樣:

http://chinese.engadget.com/2008/06/18/singulum-luxury-laptops/

Lin Jen-Shin (godfat) said...

我想只有錢太多和神經病的交集才會買吧 XD

Post a Comment

Note: Only a member of this blog may post a comment.



All texts are licensed under CC Attribution 3.0