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

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

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

    莊周夢(mèng)蝶

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

    rails的REST特性簡記

    Posted on 2007-03-21 15:28 dennis 閱讀(3523) 評(píng)論(1)  編輯  收藏 所屬分類: 動(dòng)態(tài)語言
    1.關(guān)于REST的URL的詳細(xì)討論,參見《RESTful Rails development》文檔,這里有中文翻譯。Path-Methods對(duì)照表:
    REST7.gif

    2.在Controller和View中新增加了一些helper方法,URL路由的設(shè)置來自config目錄下的routes.rb中的一行代碼:
    ?map.resources?:projects

    這行代碼將自動(dòng)產(chǎn)生用于Controller的系列url方法和用于View的系列Path方法,對(duì)照表
    路由 ????? ? ? ? 產(chǎn)生的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.路由的定制,通過下面的選項(xiàng)來定制符合個(gè)人需要的路由規(guī)則:
    :controller.???設(shè)置使用的Controller.
    :path_prefix.??URL前綴.
    :name_prefix.??用于設(shè)置產(chǎn)生的helper方法的前綴?
    :singular.?To?name?the?singular?name?to?be?used?for?the?member?route.

    4.Nested Resource(嵌套資源乎?),當(dāng)rails采用REST架構(gòu)時(shí)如何處理過去的Model之間的關(guān)聯(lián)關(guān)系,比如1:N?比如以文檔中的例子來說明,一個(gè)project可能有多個(gè)iteration,典型的一對(duì)多關(guān)系,我們?cè)诋a(chǎn)生Model后,與傳統(tǒng)rails一樣,設(shè)置關(guān)聯(lián)關(guān)系:
    class?Project?<?ActiveRecord::Base
    ??has_many?
    :iterations
    end

    class?Iteration?
    <?ActiveRecord::Base
    ??belongs_to?
    :project
    end

    1)既然是REST架構(gòu),那么路由改如何設(shè)置呢?或者說我們?cè)撛趺丛L問某個(gè)project的所有itration呢?直觀的感覺應(yīng)該是http://localhost:3000/project/:project_id/iterations,那么可以這樣修改routes.rb,把生成的
    map.resources?:iterations
    修改為:
    map.resources?:projects?do?|projects|
    ???projects
    .resources?:iterations
    end
    將自動(dòng)產(chǎn)生如下格式的路由:
    /project/:project_id/iterations
    /project/:project_id/iterations/:id

    2)接下來,應(yīng)當(dāng)修改IterationsController的增、改、查action了,因?yàn)橐P(guān)聯(lián)project對(duì)象,在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)相應(yīng)的iteration的Controller和View的Url和Path等helper都增加了一個(gè)參數(shù),他們的第一個(gè)參數(shù)都將是project_id,比如
    <%=?link_to?"Show",iteration_path(iteration.project,
    iteration)?
    %>

    <%=?link_to?"Edit",?edit_iteration_path(iteration.project,
    iteration)?
    %>
    同樣,所有form_for指向的url的helper也都增加了這個(gè)參數(shù)。總結(jié)一句話,被嵌套類(這里的iteration)的所有helper都增加一個(gè)參數(shù)并且是第一個(gè)參數(shù)——外包類(這里的project)的id

    5.自定義action,對(duì)于不能歸結(jié)為crud操作的action,我們需要自己定義action,已經(jīng)說過,REST把所有的遠(yuǎn)程調(diào)用抽象為對(duì)遠(yuǎn)程資源的CRUD操作,非CRUD操作應(yīng)當(dāng)轉(zhuǎn)化或者說抽象成CRUD操作,比如對(duì)于project可以有一個(gè)關(guān)閉操作close,我們可以把它理解成一個(gè)http POST請(qǐng)求去修改project的closed字段為true,這樣一來這個(gè)操作也可以當(dāng)作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來調(diào)用此方法,請(qǐng)注意,POST的方法需要通過Form來實(shí)現(xiàn),因此我們使用button_to:
    <td><%=?button_to?"Close",?close_project_path(project)?%></td>

    自定義action不僅僅可以使用REST風(fēng)格,傳統(tǒng)的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中增加一行進(jìn)行注冊(cè),比如pdf格式?
    Mime::Type.register?"application/pdf",?:pdf
    當(dāng)然,你需要實(shí)現(xiàn)自己的to_pdf方法了

    7.在rails1.2中使用AJAX與過去沒有什么不同,僅僅是頁面調(diào)用的URL全部改成新增加的那些Path helper

    8.激動(dòng)人心的ActiveResource,目前還未正式加入rails1.2,值的期待,簡單來說就是就是通過這個(gè)庫你將可以使用所有按照REST實(shí)現(xiàn)的web APIS,操作遠(yuǎn)程的資源將和操作本地的ActiveRecord一樣。

    《RESTful Rails Development》下載



    評(píng)論

    # re: rails的REST特性簡記  回復(fù)  更多評(píng)論   

    2009-10-28 17:12 by valu
    SvnHosting服務(wù)提供商 http://svn.valu.cn
    主站蜘蛛池模板: 免费人妻无码不卡中文字幕系| 免费在线观看视频网站| 亚洲av色福利天堂| 日本zzzzwww大片免费| 久久精品国产亚洲AV电影网| 亚洲香蕉网久久综合影视| 国产福利视精品永久免费| 色老头综合免费视频| 亚洲人成网站影音先锋播放| 日本高清免费中文字幕不卡| 暖暖免费日本在线中文| 亚洲日韩国产二区无码| 国产亚洲综合一区柠檬导航| 噜噜嘿在线视频免费观看| 在线涩涩免费观看国产精品| 亚洲第一第二第三第四第五第六| 亚洲欧洲日产国码无码久久99 | 久久成人无码国产免费播放| 亚洲爆乳无码专区www| 亚洲成AV人片在| 免费人成年轻人电影| 免费在线观看h片| 你是我的城池营垒免费看 | 亚洲变态另类一区二区三区| 亚洲色图国产精品| 亚洲女人被黑人巨大进入| 无码日韩精品一区二区免费| 久久aⅴ免费观看| 一级特黄录像视频免费| 亚洲人成网站色7799| 精品亚洲A∨无码一区二区三区| 亚洲精品国产V片在线观看| 99久久这里只精品国产免费| 嫩草成人永久免费观看| 一级毛片成人免费看a| 亚洲AV无码男人的天堂| 亚洲一本之道高清乱码| 亚洲国产国产综合一区首页| 亚洲综合色区在线观看| 免费看小12萝裸体视频国产 | 亚洲日韩激情无码一区|