2011-03-30 75 views
5

我已定義的資源,像這樣:Rails中更換默認路由的資源3

resources :referrals, :except => [:show, :edit, :destroy] 

,我想取代(不只是添加命名的路由)默認路由Rails生成,特別是更新操作。

這裏是我的耙路線:

referrals GET /referrals(.:format)  {:action=>"index", :controller=>"referrals"} 
      POST /referrals(.:format)  {:action=>"create", :controller=>"referrals"} 
new_referral GET /referrals/new(.:format) {:action=>"new", :controller=>"referrals"} 
referral  PUT /referrals/:id(.:format) {:action=>"update", :controller=>"referrals"} 
share    /share(.:format)   {:controller=>"referrals", :action=>"new"} 
special   /special(.:format)  {:controller=>"referrals", :action=>"index"} 
thanks   /thanks(.:format)  {:controller=>"pages", :action=>"thanks"} 
        /:shortlink(.:format) {:controller=>"referrals", :action=>"update"} 
        /:linktext(.:format)  {:controller=>"referrals", :action=>"update"} 
root    /(.:format)    {:controller=>"pages", :action=>"home"} 

我想無論是

/:shortlink(.:format) 

/:linktext(.:format) 

命中更新操作,但不

/referrals/:id(.:format) 

這是爲了實現一種非密碼「安全」的形式。當PUT進入更新動作時,我想要發生某些事情,但我不想要求授權來做到這一點,而且我也不想讓基於控制器名稱和簡單的低分辨率字符串輕易猜測url,編號的ID。

我該如何充分取代由rails給出的默認路由?

+3

更多信息在路線的ID沒有被模型ID它可以是任何URL編碼屬性,例如隨機散列字符串。這樣做可以節省彎曲導軌,使其不會彎曲。 – 2011-03-30 22:35:18

+0

謝謝@ Douglas-F-Shearer!我只是通過覆蓋Referral模型的'to_param'方法來使用你所說的內容來返回url構造中的params的shortlink屬性而不是模型ID。現在通過使用'find_by_shortlink(params [:id])''我可以做我想做的事情,同時防止簡單號碼工作 – Bodhi 2011-03-30 22:51:33

+0

有趣的是,'to_param'重寫只是爲了使'referral_url'正確工作這當然是一件好事)。嚴格地說,我可以在我的控制器中純粹用我的'find_by_shortlink(params [:id])'完成我在問題中提出的問題。 – Bodhi 2011-03-30 22:58:17

回答

2

resources :referrals, :except => [:show, :edit, :destroy, :update]

match "/whatever_you_want/:variable_here" => "referrals#updated", :as=> the_link, :via=> :put

然後在你的控制器,你將與

params[:variable_here]

這裏帕拉姆訪問參數是任何你想要以比較在數據庫和路徑將會像這樣創建:

the_link_paththe_link_url

的:通過部分將限制每個HTTP方法的路徑,以便容下請求將匹配在這裏 http://guides.rubyonrails.org/routing.html