Rails之道 ---><The Rails Way> 摘录(3)路由

1.路由系統是一個強大的雙向發送復合體,它接受URL,適當的尋址,也可以使用路由規則作為一個模板生成URL字符串.
[size=medium][color=red](接受URL屬于基本操作,構建URL算進階,好好掌握這兩點,Route會成為你的最佳拍檔)[/color][/size]

[quote](1)識別URL是有用的,當一個特殊請求進來的時候,它決定了應用程序應該如何做;

(2)生成URL也很有用,當你需要生成一個URL時,它允許你在視圖模板和控制器中使用相對高級的語法.

(3)路由系統主要處理兩個問題:如何解析(辨識)一個URL請求和如何編寫(生成)一個URL,它會基于你提供的規則去執行這兩個過程(config/routes.rb都懂咯)
[/quote]

2.URL辨識和生成是兩個不同的工作(辨識進來的請求,同時生成相應的HTML代碼)
[quote](1)"同樣的規則"管理同樣的生成/辨識過程.對于同一條規則你不需要寫第二次,你寫了一條規則,邏輯流就會在每次重定向到時候運行它.

(2)由路由系統生成的URL(通過link_to和其它方式)僅能被路由系統所識別.由系統生成的recipses/aooles路徑和服務器如何處理這個路徑沒關系,直至這個路徑被路由解析之后,才能觸發控制器動作.不知道路由規則的人,光通過路徑字符串是無法獲悉URL的意義.

(3)路由系統會按照routes.rb中定義的、使用模式或參數匹配URL.如果一個給定的規則失敗,會依次匹配下一個.一旦任何一個路由規則匹配成功,匹配搜索就結束.[/quote]

3.你可以通過使用" "設定網站首頁(map.connect ' ', :controller => "fire")
[color=red](備注: Rails2.0使用root來定義空路由,因此前面的代碼不適用于現在的環境)[/color]
map.root :controller => "homepage"


4.你可以修改默認路由為map.connect ':action/:controller/:id',不過默認的路由比較好...看你自己需求

5.打開routes.rb,你會看到這樣一句代碼 map.connect ':controller/:action/:id.:format'(備注:結尾的.:format匹配到id字段后的一個點和format通配符.這將會匹配如下URL)
http://localhost:3000/recipe/show/3.xml
(1)respond_to 方法允許根據請求的格式來編寫動作,因此控制器可以根據請求的格式返回不同的結果.

def show
@article = Article.find(params[:id])

respond_to do |format|
format.html
format.xml { render :xml => @article.to_xml }
end
end

上面代碼中的respond_to代碼塊有2個子句,HTML子句由format.html組成,HTML請求將會由通常的RHTML視圖模板處理.XML子句則包含一個代碼塊,如果是XML請求,就會運行這個塊,同時將結果返回給客戶.

(2)你可以通過設定HTTP-Accept報頭去出發respond_to的分支.如果這樣做了,在URL中就無需添加.:format
wget http://localhost:3000/items/show/3 -O - —header=”Accept:
text/xml”
Resolving localhost... 127.0.0.1, ::1
Connecting to localhost|127.0.0.1|:3000... connected.
HTTP request sent, awaiting response...
200 OK
Length: 295 [application/xml]
<item>
<created-at type=”datetime”>2007-02-16T04:33:00-05:00</created-at>
<description>Violin treatise</description>
<id type=”integer”>3</id>
<maker>Leopold Mozart</maker>
<medium>paper</medium>
<modified-at type=”datetime”></modified-at>
<year type=”integer”>1744</year>
</item>


6.在編寫路由信息時,需要思考下面兩個問題:

[quote](1)在辨識方面,你的路由信息必須包含足夠的信息-------既可以是硬編碼的,也可以是從URL中接收到的值.

(2)在生成方面,需要確定硬編碼的參數和通配符,以提供足夠多的值來使用路由規則.[/quote]

7.模式字符串的數字區域和綁定的數字沒有任何聯系.

map.connect "auctions/:id", :controller => "auctions", :action => "show"


這條路由規則可以辨識這樣的URL。
http://localhost:3000/auctions/8
在這條路由規則中, "auction"是一個靜態字符串.出于辨識目的,路由系統將會在URL中選找它,當你使用如下的代碼生成URL時,也會插入到URL中.

<%= link_to “Auction details”,
:controller => “auctions”,
:action => “show”,
:id => auction.id %>


8.路由次序要把握好.
參考代碼-->

case string
when /./
puts “Matched any character!”
when /x/
puts “Matched ‘x’!”
end


9.

map.connect ':controller/:show/:id',
:action => "show", :requirements => {:id => /\d+/}


10.我們所使用的URL生成技術(link_to、redirect_to等等);實際上都在底層調用了url_for方法.
[quote](1)url_for方法的作用是從你的標識符中生成URL,并結合規則在路由信息中去匹配

(2)對于URL部分參數的缺失,url_for默認只將值匹配到:controller和:action上,至于其它的參數就需要通過路由規則去解決

(3)一旦發現不是默認值,url_for會就此停止使用默認值.它認為一旦你不使用默認值之后,很可能在接下去部分也不再使用默認值.所以非默認字段和這個字段右邊的其他所有字段都不會自動使用當前請求的默認值[/quote]

10.可以寫 <"= link_to "Help"", "/main/help"> 相當于
<%= link_to "Help", :controller => "main", :action => "help" %>(不過不建議這樣寫)

11.如何匹配這種路由
/files/list/base/books/fiction/dickens
=>map.connect 'files/list/*specs'
def list
specs = params[:specs] # e.g, [“base”, “books”, “fiction”, “dickens”]
end

warning - ->
map.connect ‘files/list/*specs/dickens’ # Won’t work!


12.具名路由的具體方法是使用名字(自定義的)調用映射對象方法,并用它取代通常的鏈接.

map.help 'help',
:controller => "main",
:action => "show_help"


通過上面代碼,我們可以得到help_url和help_path這兩個方法,它們可以在URL或URL組件中使用.

<%= link_to "Help!", help_path %>


(備注:它的超鏈接為/help)
[quote]
(1)_url方法會生成一個完整的URL,包含協議和域名,_path方法僅僅生成了路徑的一部分(很多時候可以認為是相關路徑)

(2)redirect_to 方法需要使用具名路由作為參數時,應該用_url版本

(3)除了重定向、靜態鏈接和其它的一些情況外,Rails都是使用_path代替_url[/quote]

13.
map.with_options :controller => “main” do |main|
main.help ‘/help’, :action => “help”
main.contact ‘/contact’, :action => “contact”
main.about ‘/about’, :action => “about”
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值