作者godfat (godfat 真常)
看板Ruby
标题[心得] 一点 rails 杂项心得
时间Tue Dec 11 23:48:43 2007
最近在写 rails 2.0, 一点零散的心得:
1. 靠 has_many :through 确实可以完成很多工作,
使得 conditions 可以少下很多。不过离我想像中的
OO 还有很长很长的一段路......(有时候听到一些 association
不 OO 的说法,就让我不知道该怎麽接话下去...)
*
2. 用了一个取巧的方式使得我这边的程式不用同步对方
server 上的 model. 大致的问题在於如果我只单单 query 对方的资料,
会使得我这边的资料难以纪录,因为有很多额外资讯需要纪录。
目前的解法是做个类似 proxy 的东西。我原本是在想,
这东西应该要是一个 < ActiveRecord::Base 的东西,
还是 < MyModel 的东西?目前的作法是都不必,
他大概长这样:
class Friend
undef :id # make it fall through method_missing
def initialize data
@data = data
@user = User.find :first,
:conditions => ['remote_friends_id = ?', self.remote_friends_id] rescue nil
end
def method_missing msg
@data[msg.to_s] || @user.send(msg) # rescue nil
end
end
这样一来,我就可以透过这个 Friend 取得之前用 open-uri
取得的远端资料,同时可以存取他在於本地端的资料,
也就是我需要额外纪录的资料,也不用做这份 friends 的同步动作。
*
3. mongrel 一次只能处理一个 request?
为了测试方便,我另外开了一个 controller 来产生伪造的资料。
於是我就在一个 request 中再丢出另外一个 request...
结果就 timeout 了 =_=
我很困惑,应该没写错什麽才对,才忽然想到 mongrel 好像只能处理一个 request.
我想事情是这样的:
1. request for a page
2. request for remote data
3. request for remote data
4. request for remote data
因为 1. 会产生 2~4, 然而 1 还没结束,所以 2~4 只是进去 mongrel 的
request queue... 2~4 都在等 1 处理完,但是 1 需要 2~4 的结果,
这样就卡死了 =_=b
另外开一个 mongrel, 开另外一个 port, 改成 request 那个 mongrel,
结果就没问题了.....
发现这件事的原因是 test 都能过,不懂为什麽 browser 就死 = =b
所以就想到可能是 server 造成的了。
有写 test 真的是能让开发变得顺利许多......
不过事後再写意义也不大就是了,一定要先写或是中途写。
*
4. 我不是很懂何谓 REST, 每次看到一堆超长的描述就懒得看...
不过 respond_to 写起来真的是很爽,可以同时处理一大群的 output.
像是现在我写了这个:
class ApplicationController < ActionController::Base
before_filter :restful_response
protected
def restful_response
template = "#{self.controller_name}/#{self.action_name}.xhtml.erb"
respond_to{ |format|
format.html{ render :template => template }
format.xhtml
format.xml{ render :template => template, :layout => false }
}
end
end
这样我的 xhtml/html/xml 都可以使用同样的 template,
而 layout 则各自用各自的 layout.
xhtml 就输出 XHTML 1.1, html 输出 XHTML 1.0 Transitional,
xml 只输出单纯的内容,这个东西会交给 link_to_remote :update 使用:
def menu_item title, url
link_to_remote title, :update => 'content',
:url => url.reverse_merge(:format => 'xml')
end
除此之外,要支援 RSS 2.0 和 ATOM 1.0 也是很容易... 真好啊。
rails 1.2.x 的 rxml 真的太残废了..... 之前搞半天现在几行就好。
除此之外,还设定了 xhtml mime type:
Mime::Type.register 'application/xhtml+xml', :xhtml
全面使用 XHTML 绝对是大有好处的 @@
HTML 的缺点实在是太多了......
(像是,哪里 tag 有 typo, browser 处理 HTML 都是容错,
然後就很容易搞不清楚错在哪?XHTML, browser 会报错,有 error message 啊!)
(不过 IE 好像没有就是了?至少 firefox 2, safari 3, opera 9 都有...)
虽然说要把别人给我的 HTML 改写成 XHTML 实在非常费力,
但是改成的话後来不管做什麽都非常容易 :D
(除了如果还要去 merge 新版 HTML 的 layout Orz, 这一样很费力)
*
5. fixtures 不用再写 id 了。不过似乎不能产生完全空的 fixture,
这样我只好乱写一些属性了 @@
model unit test 不用再宣告 fixtures...
controller functional test 也不用再写一堆设定,(原本要吗?)
大概就差 view 的 test 还没写吧...(这要怎麽写?)
有写 test 真的很有好处,至少对於有没有 bug 这件事会多很多信心 XD
不过也是这次比较不赶才在尝试新东西...
*
Ruby: 1.8.6.110
Rails: 2.0.1
Mongrel: 1.1.1
RubyGems: 0.9.5
OS: Mac OS X 10.4.11
编辑器:TextMate 1.5.5
Shell: fish 1.22.3
版本控制:SVK 2.0.2
资料库:MySQL 5.0.45(担心衔接问题,不然会用 PostgreSQL)
output:
XHTML 1.1 + XHTML 1.0 Transitional + XML (用 w3c validator 测试)
测试 browser:
Safari 3.0.4 + Navigator 9.0.0.4 (fx 2.0.0.10 based) + Opera 9.24
如果方便的话我也想测 IE, 因为他最会捅篓子...(而且不吃 XHTML...)
之前还碰过 flash 是只有 IE 某些版本才会出问题,搞不懂为什麽...
希望 IE 8 快出来把可怕的 IE 6 都干掉 Orz
--
『风车』が廻り続ける度に 『美しき』幻想が静かに纺がれ
『焔』の揺らめきの外に 『腕』を伸ばす愚かな者达 -《Roman》5th Story
『宝石』をより多く掴もうと 『朝と夜』の狭间を彷徨い続ける Track 10
『星屑』の砂の煌めきにも 『葡萄酒』の仄甘い陶酔を魅せ 黄昏の贤者
『贤者』が忌避する槛の中から 『伝言』の真意を彼等に问うだろう
『天使』が别れを告げし时 『地平线』は第五の物语を识る
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
※ 编辑: godfat 来自: 220.135.28.18 (12/12 00:55)
1F:推 ihower:in fact, xhtml is dead. html is future...:) 12/12 02:34
2F:→ godfat:why? any reference? 12/12 16:41