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

本文深入探讨Rails中的路由系统,包括URL的识别与生成原理、路由规则的定义与应用,以及如何通过具名路由提高开发效率。
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
内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值