閱讀441 返回首頁    go 阿裏雲 go 技術社區[雲棲]


rails的REST特性簡記

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

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呢?直觀的感覺應該是https://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

你可以通過https://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》下載

文章轉自莊周夢蝶  ,原文發布時間5.17

最後更新:2017-05-17 12:02:01

  上一篇:go  《Programming Ruby中文版:第2版》終於正式出版了
  下一篇:go  體驗rails1.2的REST風格