rails的REST特性簡記
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.
: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
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
將自動產生如下格式的路由:projects.resources :iterations
end
/project/:project_id/iterations
/project/:project_id/iterations/:id
/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
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)的iditeration) %>
<%= link_to "Edit", edit_iteration_path(iteration.project,
iteration) %>
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
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
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