1.關(guān)于REST的URL的詳細(xì)討論,參見《RESTful Rails development》文檔,
這里有中文翻譯。Path-Methods對(duì)照表:

2.在Controller和View中新增加了一些helper方法,URL路由的設(shè)置來自config目錄下的routes.rb中的一行代碼:
?map.resources?:projects
這行代碼將自動(dòng)產(chǎn)生用于Controller的系列url方法和用于View的系列Path方法,對(duì)照表
路由 ????? ? ? ? 產(chǎn)生的Helper
-----------------------------------------------------------
projects ??? ? projects_url, projects_path
project??????? project_url(id), project_path(id)
new_project??? new_project_url, new_project_path
edit_project?? edit_project_url(id), edit_project_path(id)
3.路由的定制,通過下面的選項(xiàng)來定制符合個(gè)人需要的路由規(guī)則:
:controller.???設(shè)置使用的Controller.
:path_prefix.??URL前綴.
:name_prefix.??用于設(shè)置產(chǎn)生的helper方法的前綴?
:singular.?To?name?the?singular?name?to?be?used?for?the?member?route.
4.Nested Resource(嵌套資源乎?),當(dāng)rails采用REST架構(gòu)時(shí)如何處理過去的Model之間的關(guān)聯(lián)關(guān)系,比如1:N?比如以文檔中的例子來說明,一個(gè)project可能有多個(gè)iteration,典型的一對(duì)多關(guān)系,我們?cè)诋a(chǎn)生Model后,與傳統(tǒng)rails一樣,設(shè)置關(guān)聯(lián)關(guān)系:
class?Project?<?ActiveRecord::Base
??has_many?:iterations
end
class?Iteration?<?ActiveRecord::Base
??belongs_to?:project
end
1)既然是REST架構(gòu),那么路由改如何設(shè)置呢?或者說我們?cè)撛趺丛L問某個(gè)project的所有itration呢?直觀的感覺應(yīng)該是http://localhost:3000/project/:project_id/iterations,那么可以這樣修改routes.rb,把生成的
map.resources?:iterations
修改為:
map.resources?:projects?do?|projects|
???projects.resources?:iterations
end
將自動(dòng)產(chǎn)生如下格式的路由:
/project/:project_id/iterations
/project/:project_id/iterations/:id
2)接下來,應(yīng)當(dāng)修改IterationsController的增、改、查action了,因?yàn)橐P(guān)聯(lián)project對(duì)象,在Controller中可以通過params[:project_id]獲取該iteration所在的project。比如修改index action:
def?index
??project?=?Project.find(params[:project_id])
??@iterations?=?project.iterations.find(:all)
??respond_to?do?|format|
?????format.html?#?index.rhtml
?????format.xml?{?render?:xml?=>?@iterations.to_xml?}
??end
end
3)相應(yīng)的iteration的Controller和View的Url和Path等helper都增加了一個(gè)參數(shù),他們的第一個(gè)參數(shù)都將是project_id,比如
<%=?link_to?"Show",iteration_path(iteration.project,
iteration)?%>
<%=?link_to?"Edit",?edit_iteration_path(iteration.project,
iteration)?%>
同樣,所有form_for指向的url的helper也都增加了這個(gè)參數(shù)。總結(jié)一句話,被嵌套類(這里的iteration)的所有helper都增加一個(gè)參數(shù)并且是第一個(gè)參數(shù)——外包類(這里的project)的id
5.自定義action,對(duì)于不能歸結(jié)為crud操作的action,我們需要自己定義action,已經(jīng)說過,REST把所有的遠(yuǎn)程調(diào)用抽象為對(duì)遠(yuǎn)程資源的CRUD操作,非CRUD操作應(yīng)當(dāng)轉(zhuǎn)化或者說抽象成CRUD操作,比如對(duì)于project可以有一個(gè)關(guān)閉操作close,我們可以把它理解成一個(gè)http POST請(qǐng)求去修改project的closed字段為true,這樣一來這個(gè)操作也可以當(dāng)作CRUD操作了。需要做的是在routes.rb增加一行:
map.resources?:projects,?:member?=>?{?:close?=>?:post?}
定義close action是POST方法,在Controller增加close方法:
def?close
?? respond_to?do?|format|
????? if?Project.find(params[:id]).update_attribute(:closed,?true)
?????? flash[:notice]?=?"Project?was?successfully?closed."
?????? format.html?{?redirect_to?projects_path?}
?????? format.xml?{?head?:ok?}
???? else
?????? flash[:notice]?=?"Error?while?closing?project."
?????? format.html?{?redirect_to?projects_path?}
?????? format.xml?{?head?500?}
?? ? end
?? end
end
你可以通過http://localhost:3000/project/:project_id;close來調(diào)用此方法,請(qǐng)注意,POST的方法需要通過Form來實(shí)現(xiàn),因此我們使用button_to:
<td><%=?button_to?"Close",?close_project_path(project)?%></td>
自定義action不僅僅可以使用REST風(fēng)格,傳統(tǒng)的controller/action/id的方式仍然可以使用,注意下routes.rb的最后兩行即可。
6.自定義格式,rails支持的格式有:
respond_to?do?|wants|
??wants.text
??wants.html
??wants.js
??wants.ics
??wants.xml
??wants.rss
??wants.atom
??wants.yaml
end
自定義格式需要在config/environment.rb中增加一行進(jìn)行注冊(cè),比如pdf格式?
Mime::Type.register?"application/pdf",?:pdf
當(dāng)然,你需要實(shí)現(xiàn)自己的to_pdf方法了
7.在rails1.2中使用AJAX與過去沒有什么不同,僅僅是頁面調(diào)用的URL全部改成新增加的那些Path helper
8.激動(dòng)人心的ActiveResource,目前還未正式加入rails1.2,值的期待,簡單來說就是就是通過這個(gè)庫你將可以使用所有按照REST實(shí)現(xiàn)的web APIS,操作遠(yuǎn)程的資源將和操作本地的ActiveRecord一樣。
《RESTful Rails Development》下載