"projects",:action=>"show",:id=>project=>

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

應(yīng)用Rails進(jìn)行REST 開發(fā)(三)

系統(tǒng) 1569 0

REST 風(fēng)格的URL 和View
View是系統(tǒng)界面和用戶之間的一個(gè)表現(xiàn),用戶通過鏈接和按鈕來和系統(tǒng)進(jìn)行交互。傳統(tǒng)上Rails的開發(fā)人員使用 link_to 這個(gè)helper 方法來構(gòu)造一個(gè)鏈接,這個(gè)方法需要一個(gè) hashmap, hashmap 由 controller 和 action 組成;此外,還可以傳遞一些其他的參數(shù)。例如:
??? link_to :controller => "projects", :action => "show", :id => project
??? =>
??? <a href="/projects/show/1">Show</a>

我們馬上就意思到,這個(gè)link_to 方法并不能很好的用于我們的REST思想:REST不會(huì)在URL里包含action。
那么重要的就是通過鏈接和按鈕,我們要把 http 協(xié)議的4個(gè)動(dòng)作和URL一起傳遞給服務(wù)器。所以,我們會(huì)看到Rails的改進(jìn)之處:我們?nèi)匀皇褂?link_to 去創(chuàng)建鏈接,但是,我們不會(huì)再使用hashmap, 而是使用一個(gè)“path”的方法。首先用一個(gè)例子,來說明如何創(chuàng)建一個(gè)鏈接去調(diào)用 controller 的 show action。請看好,我
們不會(huì)再使用 controller, action, 和 id 了:

??? link_to "Show", project_path(project)
??? =>
??? <a href="/projects/1">Show</a>

關(guān)于 path 和下面要說的url 這兩類helper 方法,請大家千萬不要疑惑他們是從哪來的。我們可以這么認(rèn)為,是Rails 動(dòng)態(tài)地創(chuàng)造了他們。我們只要使用就可以了!

傳統(tǒng)的link_to 所生成的鏈接中包含了controller和action,相對比,使用新的 “project_path” 所創(chuàng)建的鏈接,只包含了controller 和 資源的id –毫無疑問,這是一個(gè) REST風(fēng)格的URL。因?yàn)殒溄幽J(rèn)的是一個(gè)“Get”請求,Rails 能夠知道這一點(diǎn),所以就會(huì)去調(diào)用 show action。對于每一個(gè)資源,rails 都會(huì)有7個(gè)標(biāo)準(zhǔn)的 path 方法,這些可以從表1.2中看到。

每一個(gè)path 方法都關(guān)聯(lián)一個(gè) http 協(xié)議的動(dòng)作,一些請求(例如show,create),可以通過http協(xié)議的 Get 或 Post 傳遞給服務(wù)器;但是有一些請求,如 update,delete,則需要一些其他的方式(如使用隱藏的變量)傳遞給服務(wù)器,因?yàn)闉g覽器并不知道 PUT和DELETE動(dòng)作。接下來的章節(jié)我們會(huì)仔細(xì)的介紹。

進(jìn)一步看看這個(gè)表,我們也會(huì)發(fā)現(xiàn)4個(gè)http 動(dòng)作,并不足以包含全部的CRUD操作。前2個(gè)方法使用Get的方式會(huì)工作的很好,但是對于new_project_path 和 edit_project_path 就不同了。

New 和 Edit
用戶如果點(diǎn)擊一個(gè)“新建”鏈接,那么會(huì)使用Get動(dòng)作來對服務(wù)器發(fā)送一個(gè)請求。下面的例子表明,生成的鏈接是由 controller 和一個(gè)“new”action 組成的。

link_to "New", new_project_path
=>
<a href="/projects/new">New</a>

這是對REST思想的一種破壞?或許乍看之下確實(shí)如此。但是如果你仔細(xì)看,那么一切都會(huì)清晰,“new”并不是一個(gè)CURD的action,它更像一個(gè)建立一個(gè)新的資源之前的準(zhǔn)備的動(dòng)作。真正的CRUD 中的create被調(diào)用,是在新的form被提交的以后才執(zhí)行的。這個(gè)鏈接當(dāng)然也沒有資源的id—因?yàn)橘Y源還沒有被創(chuàng)建。一個(gè)鏈接如果沒有資源的id,那么就不應(yīng)該被稱為REST的URL,因?yàn)镽EST的URL總是會(huì)指定一個(gè)資源的id。所以,這個(gè) “new” action 僅僅因該用來顯示一個(gè)新的form的頁面而已。

對于 edit_project_path ,也是同樣的道理。它引用了一個(gè)資源,但是僅僅是在調(diào)用 update action 之前的準(zhǔn)備工作。真正的update action 是在頁面被提交以后才執(zhí)行的。edit_project_path 和 new_project_path 唯一的區(qū)別就是前者需要使用一個(gè)資源的id。按照REST的規(guī)則,資源的id放在controller 的后面:/project/1 。但是如果僅僅使用Get 動(dòng)作來提交這個(gè)URL,那么Rails將會(huì)認(rèn)為你要調(diào)用的是show action。為了防止這一點(diǎn),edit_project_path 方法擴(kuò)展了一下生成的鏈接,例如:

link_to "Edit", edit_project_path(project)
=>
<a href="/projects/1;edit">Edit</a>

這樣,我們就能理解為什么允許 edit_project_path 和 new_project_path生成的鏈接里帶有 action 了,因?yàn)樗麄儍蓚€(gè)都不是REST的 CRUD URL,他們僅僅是準(zhǔn)備工作。還有其它的一些URL和這兩個(gè)很相似,我們會(huì)在后面的章節(jié)介紹。

在 form 中使用 path 方法:Create 和 Update
傳統(tǒng)的方式上,我們使用 form_tag 或 form_for 來創(chuàng)建一個(gè)form:

<% form_for :project, @project, :url => { :action => "create" } do |f|
%>
...
<% end %>

在REST應(yīng)用中,這個(gè) :url hashmap 會(huì)被 path 方法給取代:

“project_path” 創(chuàng)建新的資源所使用的form
“project_path(:id)”編輯一個(gè)資源所使用的form

a) 創(chuàng)建資源所使用的form
form 使用 post 動(dòng)作向服務(wù)器提交信息,“project_path”方法并不會(huì)有資源id作為參數(shù),這樣,生成的URL就應(yīng)該是“/projects”這個(gè)樣子。當(dāng)提交到服務(wù)器以后,就會(huì)調(diào)用 create action。

form_for(:project, :url => projects_path) do |f| ...
=>
<form action="/projects" method="post">

b) 編輯一個(gè)資源所使用的form
按照REST的思想,一個(gè)更新的操作是使用http協(xié)議的PUT動(dòng)作來發(fā)送的。但是,正如我們所知道的,瀏覽器只明白 Post和Get動(dòng)作。解決的辦法就是使用

form_for 方法里的 :html 參數(shù)。
form_for(:project, :url => project_path(@project),
:html => { :method => :put }) do |f| ...
=>
<form action="/projects/1" method="post">
<div style="margin:0;padding:0">
<input name="_method" type="hidden" value="put" />
</div>

Rails 生成了一個(gè)隱藏的字段來代替http的put 動(dòng)作。提交以后,Rails 會(huì)檢查這個(gè)變量,然后判斷是否去調(diào)用update方法。

刪除
恐怕我們已經(jīng)發(fā)覺了,用于顯示和刪除一個(gè)資源,所使用的path方法都一樣:

link_to "Show", project_path(project)
link_to "Destroy", project_path(project), :method => :delete

唯一的不同就是 刪除的時(shí)候,使用了一個(gè)變量 :method,用它來表示http的DELETE動(dòng)作。因?yàn)闉g覽器不支持DELETE動(dòng)作,所以,Rails 會(huì)生成一些javascript來解決這個(gè)問題:

link_to "Destroy", project_path(project), :method => :delete
=>
<a href="/projects/1"
onclick="var f = document.createElement(’form’);
f.style.display = ’none’; this.parentNode.appendChild(f);
f.method = ’POST’; f.action = this.href;
var m = document.createElement(’input’);
m.setAttribute(’type’, ’hidden’);
m.setAttribute(’name’, ’_method’);
m.setAttribute(’value’, ’delete’); f.appendChild(m);f.submit();
return false;">Destroy</a>

這段javascript 會(huì)生成一個(gè)form,把 http 的DELETE動(dòng)作放在隱藏變量里傳遞給服務(wù)器,然后,Rails 會(huì)判斷這個(gè)變量,決定是否去調(diào)用destroy 方法。

好了,今天就介紹到這,明天我們來說說Controller中的URL方法。

應(yīng)用Rails進(jìn)行REST 開發(fā)(三)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!??!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产大战女模特在线视频 | 99热这里只有精品88 | 真实国产乱人伦在线视频播放 | 国产l精品国产亚洲区久久 国产l精品国产亚洲区在线观看 | 亚洲人成亚洲精品 | 免费看真人a一级毛片 | 国产精品成人免费视频不卡 | 天堂精品高清1区2区3区 | 国产对白有声小说 | 亚洲最大成人网 色香蕉 | 午夜网站在线观看免费网址免费 | 五月花精品视频在线观看 | 伊人国产在线 | 中国在线播放精品区 | 青草久操 | 久久精品国产一区二区三区肥胖 | 免费永久欧美性色xo影院 | 大学生一一级毛片在线播放 | 精品国产综合成人亚洲区 | 午夜视频欧美 | 正在播放国产乱子伦视频 | 国内福利视频 | 5252色欧美在线男人的天堂 | 久久国产精品一区 | 欧美一区二区视频 | 日韩欧美综合 | 人成精品视频三区二区一区 | xxxx久久| 久久精品影院一区二区三区 | 久久精品综合一区二区三区 | 看一级毛片一区二区三区免费 | 久久夜靖品| 天天做天天添婷婷我也去 | 国产福利视频一区美女 | 国产一级特黄老妇女大片免费 | 日韩一级精品视频在线观看 | 天天怕夜夜怕狠狠怕 | 一区二区三区免费在线视频 | 亚洲社区在线观看 | 伊人婷婷色香五月综合缴缴情 | 国产你懂得 |