臭 merb (4)
之前說 server restart 沒問題了,不過後來又碰到好幾次,
奇怪的是,有時候會變成 worker 死了,然後也沒復活;
或是 master 死了,worker 卻還活著,而且也會動!
真是奇哉怪也。這時候也只好 killall merb; rm log/*.pid
反正現在每個不同 project 都是用不同 user, 不用擔心影響別人。
file_field 回傳的 Mash 則持有 :tempfile 就是 IO 了。
其他就是 filename, content_type 之類的資訊。rails 的作法
則是繼承 StringIO 和 TempFile 然後自己加 method 進去,
作成 UploadedStringIO 和 UploadedTempFile 之類的東西。
唔,我沒什麼意見,感覺 hash 是比較有彈性些,但其實多出來的
資訊也沒幾個,直接加 method 進去應該也沒什麼關係。
其他像是... merb action 的最後結果,居然會吐回 client!
像之前有個地方寫成 if ...; ooo; return; end 這樣居然不行,
因為我 return nil 回去了!應該要 return ''; ...
然後 redirect 的 body 就是空的 @@ 後來才發現,
redirect 本身就有 string return, 就是那個
You're redirected... 之類的訊息。所以寫在最後 redirect 時,
就會把這個 string 回傳給 client. 這,該說好聰明嗎?
我是沒有喜歡 rails 的作法,因為真的常常很怪。而 merb 這個作法,
consistency 是有比較高啦,但感覺怪怪的.....
總覺得應該還有更好的作法才對。
其他像是 rails 之前的 trick, 在 datamapper 倒是都能用。
例如用 attr_accessor 做假的 database field,
重新定義 attributes 與 attributes= 補上這些 in-memory property.
attr_accessor(*properties_memory)
def attributes
super.merge(self.class.properties_memory.inject({}){ |result, field|
result[field] = send(field)
result
})
end
def attributes= new_attrs
self.class.properties_memory.each{ |field|
send("#{field}=", new_attrs.delete(field))
}
super(new_attrs)
end
before save 前 create 另一個 model, 失敗則 halt, 並 merge errors.
def create_card
card_attrs = self.class.properties_memory[1..-1]
card = Card.new(attributes.reject{ |key, value| !card_attrs.member?(key) })
return if card.save
errors.merge!(card.errors.to_hash)
throw(:halt, false)
end
然後那個 rake task dependency 的問題... 目前好像還是無解。
移掉 Merb.load_dependencies(:environment => init_env) 的話,
就看不到 datamapper 的 task. 但加上去的話,連跑 rake -T
都需要檢查 dependency! rescue 都救不了,調查之後才發現居然是
exit(1) 離開程式 囧。我說老兄啊,你這樣不就無解了... 要我重新定義 exit???
丟個 exception 有這麼難嗎...
不過有點吃驚的是,merb-core 的程式真的很少耶。本來以為 global search
會很久,不過居然很快。光 merb-core 的話,程式碼可能比 rails 任何一個
套件 i.e. activerecord, activesupport, actionpack, 等都要來得小!
只是當然 merb-core 的 dependency 也一狗票啦 XDD
沒一點 ruby 經驗還真的沒辦法玩 merb, 至少還不夠成熟的現在是不行。
光要處理環境之類的事就煩死了 XD
不過整體來說,感覺是還不錯,就等他更成熟還有自己更熟悉吧。
0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.