`
fireflyman
  • 浏览: 113272 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

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

    博客分类:
  • ROR
阅读更多
1.路由系統是一個強大的雙向發送復合體,它接受URL,適當的尋址,也可以使用路由規則作為一個模板生成URL字符串.
(接受URL屬于基本操作,構建URL算進階,好好掌握這兩點,Route會成為你的最佳拍檔)

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

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

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


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

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

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


3.你可以通過使用" "設定網站首頁(map.connect ' ', :controller => "fire")
(備注: Rails2.0使用root來定義空路由,因此前面的代碼不適用于現在的環境)
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.在編寫路由信息時,需要思考下面兩個問題:

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

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


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方法.
  
引用
(1)url_for方法的作用是從你的標識符中生成URL,并結合規則在路由信息中去匹配

   (2)對于URL部分參數的缺失,url_for默認只將值匹配到:controller和:action上,至于其它的參數就需要通過路由規則去解決
 
  (3)一旦發現不是默認值,url_for會就此停止使用默認值.它認為一旦你不使用默認值之后,很可能在接下去部分也不再使用默認值.所以非默認字段和這個字段右邊的其他所有字段都不會自動使用當前請求的默認值


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)
引用

(1)_url方法會生成一個完整的URL,包含協議和域名,_path方法僅僅生成了路徑的一部分(很多時候可以認為是相關路徑)

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

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


13.
map.with_options :controller => “main” do |main|
  main.help ‘/help’, :action => “help”
  main.contact ‘/contact’, :action => “contact”
  main.about ‘/about’, :action => “about”
end

分享到:
评论
2 楼 fireflyman 2010-05-28  
yuan 写道
咦?我怎么记得这书讲的是rails2.0呢。

應該說一半一半吧....P5里曾經用/info/properties里顯示的Rails Version 為

引用
Ruby version 1.8.5 (i686-darwin8.8.1)
RubyGems version 0.9.0
Rails version 1.2.0
Active Record version 1.14.4
Action Pack version 1.12.5
Action Web Service version 1.1.6
Action Mailer version 1.2.5
Active Support version 1.3.1
Edge Rails revision 33
Application root /Users/obie/prorails/time_and_expenses
Environment development
Database adapter mysql
Database schema version 8
1 楼 yuan 2010-05-28  
咦?我怎么记得这书讲的是rails2.0呢。

相关推荐

Global site tag (gtag.js) - Google Analytics