這章中使用的示例,會延續上一章創建的Rails應用chapter2,但是我們會創建一個新的controller。在終端下執行:
script/generate controller chapter3 index get_time repeat reverse
這行命令生成了一個controller chapter3,4個action:index, get_time, repeat和reverse。
在上一章中,我們給出的示例頁面都是平淡無奇的,這次我們用一個HTML layout和一個CSS文件把頁面打扮一番。首先創建一個新的layout文件,app/view/layouts/application.rhtml,裏面寫一個基本的XHTML模板:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html
xmlns
="http://www.w3.org/1999/xhtml"
xml:lang
="en"
>
<
head
>
<
title
>Ajax on Rails
</title>
<
%= javascript_include_tag :defaults %
>
<
%= stylesheet_link_tag "application" %
>
</head>
<
body
>
<
h1
>Ajax on Rails
</h1>
<
%= yield %
>
</body>
</html>
在這個模板中我們實現了兩個重要的目標,首先是通過javascript_include_tag :defaults這條語句包含了Prototype和script.aculo.us(具體包括prototype.js, effects.js, dragdrop.js和controls.js),也有application.js, 第二個就是yield,這是插入action模板的地方。為了模板能更好看些,讓我們來做一個簡單的css文件,位於public/stylesheets/application.css:
body {
background-color:
#eee;
color:
#222;
font-family:
trebuchet;
padding:
0;
margin:
25px;
}
h1 {
margin:
-25px -25px 20px -25px;
padding:
50px 0 8px 25px;
border-bottom:
3px solid #666;
background-color:
#777;
color:
#fff;
font:
normal 28pt georgia;
text-shadow:
black 0px 0px 5px;
}
a {
color:
#229; }
.box {
border:
1px solid;
width:
100px;
height:
100px;
padding:
5px;
font-size:
.6em;
letter-spacing:
.1em;
text-transform:
uppercase;
margin-bottom:
20px;
}
.pink {
border-color:
#f00;
background-color:
#fcc;
}
.green {
border-color:
#090;
background-color:
#cfc;
}
.hover {
border-width:
5px;
padding:
1px;
}
ul {
background-color:
#ccc;
padding:
5px 0 5px 30px;
}
接着,我們來充實一下controller中的內容,編輯app/controllers/chapter3_controller.rb定義一些一會兒會用到的action:
class Chapter3Controller < ApplicationController
def get_time
sleep 1.second
render :text => Time.now.to_s
end
def repeat
render :text => params.inspect
end
def reverse
@reversed_text = params[:text_to_reverse].reverse
end
end
下一步就是添加視圖模板中的內容
app/views/chapter3/index.rhtml 就一行代碼:
<%= link_to "Check Time", :action => 'get_time' %>
這裏應用了like_to這個helper,上章介紹過了,它相當於下面的html代碼:
< a href ="/chapter3/get_time" >Check Time </a>
在瀏覽器中打開這個頁面,就會看到下圖所示的畫面,點擊鏈接,get_time這個action會呈遞一個當前時間的文本。
link_to有幾個注意的選項,首先, :confirm允許添加一個javascript的確認對話框,用户可以在執行之前選擇取消,假設你有一個鏈接引發一個潛在的危險動作:
<%= link_to "Fire missile", { :action => 'fire' },
:confirm => "Are you quite sure?" %>
這裏可以加一個適當的控制,用户可以選擇終止這個動作。
其次,:method選項允許指明HTTP方法是:get, :post, :put, 還是:delete. 也許這些選項顯得有點奇怪,因為一般鏈接只使用HTTP的GET方法,表單只能使用GET或者POST。那麼為什麼Rails這麼做呢?其實這裏有個小騙局,看看我為什麼這麼説:建立一個鏈接,並指定:method:
<%= link_to "Delete", "/people/1", :method => :delete %>
如果你查詢一下helper產生的源代碼,你會看到:
<a href="/people/1"
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;">Delete </a>
這段代碼截獲了link的動作,所以當點擊鏈接之後,幕後創建並且提交了一個表單。對於鏈接本身來説,這個:method只允許鏈接發起POST請求。那麼PUT和DELETE呢?為了讓他們工作,Rails使用POST方法來實現,你可以看到上面代碼中生成的Javascript的那句,一個名為_method的字段添加到了隱藏的表單中。當Rails的服務器端收到這個參數,就會以這個參數提供的方法來解釋執行這個請求。
對於正確使用HTTP 方法在第六章會深入討論。
本文轉自 fsjoy1983 51CTO博客,原文鏈接:http://blog.51cto.com/fsjoy/91136,如需轉載請自行聯繫原作者