2013-01-24 24 views
0

如果我有ID爲1的Post模型,了一個奇怪的關於ActiveRecord的.find(ID)方法

我可以通過訪問該資源

http://localhost:3000/posts/1 

但weired的是,當我使用這些URL,我可以得到相同的結果。

http://localhost:3000/posts/1somethingweird-blah-blah-blah-idont-like-this 

我該如何預防?

+1

這是因爲.find本質上只是需要你傳遞什麼PARAM和做就可以了to_i,所以字符串''1somethingweird-等等,blah- blah-idont-like-this'.to_i'會返回1 – Magicmarkker

回答

3

這可能是因爲params[:id]正在從String轉換爲int和Ruby中調用"1somethingweird-blah-blah-blah-idont-like-this".to_i實際上將導致1

您可以在路由層面解決這個問題:

resources :posts, :constraints => {:id => /[0-9]+/} 
+1

基本上.find(x)期望x是id的整數,並將其轉換爲.. – bullfrog

+0

@bullfrog是的。大多數語言在將'String'轉換爲'int'時會失敗,但Ruby喜歡實用。 :) –

+0

在旁邊注意這是一個快速的方式有你的軌道應用程序漂亮的網址,而不是枯燥的老ids :) – bullfrog

1

兩個主要選項:

  1. Put a constraint on the route
  2. 驗證控制器中的參數(例如,使用正則表達式)。

它工作的原因是因爲"1abc".to_i == 1