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

2.在Controller和View中新增加了一些helper方法,URL路由的設置來自config目錄下的routes.rb中的一行代碼:
?map.resources?:projects
這行代碼將自動產生用于Controller的系列url方法和用于View的系列Path方法,對照表
路由 ????? ? ? ? 產生的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.路由的定制,通過下面的選項來定制符合個人需要的路由規則:
:controller.???設置使用的Controller.
:path_prefix.??URL前綴.
:name_prefix.??用于設置產生的helper方法的前綴?
:singular.?To?name?the?singular?name?to?be?used?for?the?member?route.
4.Nested Resource(嵌套資源乎?),當rails采用REST架構時如何處理過去的Model之間的關聯關系,比如1:N?比如以文檔中的例子來說明,一個project可能有多個iteration,典型的一對多關系,我們在產生Model后,與傳統rails一樣,設置關聯關系:
class?Project?<?ActiveRecord::Base
??has_many?:iterations
end
class?Iteration?<?ActiveRecord::Base
??belongs_to?:project
end
1)既然是REST架構,那么路由改如何設置呢?或者說我們該怎么訪問某個project的所有itration呢?直觀的感覺應該是http://localhost:3000/project/:project_id/iterations,那么可以這樣修改routes.rb,把生成的
map.resources?:iterations
修改為:
map.resources?:projects?do?|projects|
???projects.resources?:iterations
end
將自動產生如下格式的路由:
/project/:project_id/iterations
/project/:project_id/iterations/:id
2)接下來,應當修改IterationsController的增、改、查action了,因為要關聯project對象,在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)相應的iteration的Controller和View的Url和Path等helper都增加了一個參數,他們的第一個參數都將是project_id,比如
<%=?link_to?"Show",iteration_path(iteration.project,
iteration)?%>
<%=?link_to?"Edit",?edit_iteration_path(iteration.project,
iteration)?%>
同樣,所有form_for指向的url的helper也都增加了這個參數。總結一句話,被嵌套類(這里的iteration)的所有helper都增加一個參數并且是第一個參數——外包類(這里的project)的id
5.自定義action,對于不能歸結為crud操作的action,我們需要自己定義action,已經說過,REST把所有的遠程調用抽象為對遠程資源的CRUD操作,非CRUD操作應當轉化或者說抽象成CRUD操作,比如對于project可以有一個關閉操作close,我們可以把它理解成一個http POST請求去修改project的closed字段為true,這樣一來這個操作也可以當作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來調用此方法,請注意,POST的方法需要通過Form來實現,因此我們使用button_to:
<td><%=?button_to?"Close",?close_project_path(project)?%></td>
自定義action不僅僅可以使用REST風格,傳統的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中增加一行進行注冊,比如pdf格式?
Mime::Type.register?"application/pdf",?:pdf
當然,你需要實現自己的to_pdf方法了
7.在rails1.2中使用AJAX與過去沒有什么不同,僅僅是頁面調用的URL全部改成新增加的那些Path helper
8.激動人心的ActiveResource,目前還未正式加入rails1.2,值的期待,簡單來說就是就是通過這個庫你將可以使用所有按照REST實現的web APIS,操作遠程的資源將和操作本地的ActiveRecord一樣。
《RESTful Rails Development》下載