莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          rails的REST特性簡記

          Posted on 2007-03-21 15:28 dennis 閱讀(3525) 評論(1)  編輯  收藏 所屬分類: 動態語言
          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呢?直觀的感覺應該是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》下載



          評論

          # re: rails的REST特性簡記  回復  更多評論   

          2009-10-28 17:12 by valu
          SvnHosting服務提供商 http://svn.valu.cn
          主站蜘蛛池模板: 织金县| 涞源县| 武义县| 九龙县| 北川| 大埔县| 舞阳县| 西宁市| 方城县| 霍城县| 正蓝旗| 瑞安市| 太康县| 八宿县| 衡水市| 淳安县| 济阳县| 瑞昌市| 长宁县| 兴安县| 惠东县| 垦利县| 桦甸市| 铁岭县| 永宁县| 万源市| 青州市| 喀喇| 古浪县| 东乡县| 大名县| 漾濞| 隆安县| 遵化市| 安岳县| 三原县| 凤阳县| 忻城县| 西安市| 楚雄市| 本溪|