<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    rails的REST特性簡記

    Posted on 2007-03-21 15:28 dennis 閱讀(3522) 評論(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
    主站蜘蛛池模板: 亚洲精品国产美女久久久| 在线播放免费人成毛片乱码| 亚洲一级二级三级不卡| 免费日本黄色网址| 亚洲国产精品专区| 国产免费69成人精品视频| 在线免费观看你懂的| 国产特黄特色的大片观看免费视频| 亚洲综合国产成人丁香五月激情| 亚洲成AV人片天堂网无码| 亚洲精品无码av天堂| 韩国18福利视频免费观看| 91成人免费观看网站| 蜜桃成人无码区免费视频网站 | 成人精品一区二区三区不卡免费看| 亚洲avav天堂av在线网毛片| tom影院亚洲国产一区二区| 成人毛片18岁女人毛片免费看| 国内精品久久久久影院免费| g0g0人体全免费高清大胆视频| 国产成人 亚洲欧洲| 亚洲综合小说另类图片动图| 亚洲国产成人久久精品app| 亚洲宅男永久在线| 色婷婷亚洲十月十月色天| 亚洲丝袜美腿视频| 亚洲成人免费在线| 亚洲AⅤ永久无码精品AA| 日本免费一区二区三区四区五六区| 中文字幕在线视频免费观看| 亚洲成a人无码亚洲成av无码 | 午夜无遮挡羞羞漫画免费| 国产香蕉九九久久精品免费| 日本一区二区三区免费高清| 无码国产精品一区二区免费式影视 | 84pao强力永久免费高清| 日韩精品内射视频免费观看| 2021在线永久免费视频| 最近中文字幕高清免费中文字幕mv | 天天摸天天操免费播放小视频| 成全高清视频免费观看|