2011-03-30 78 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