2012-03-16 100 views
2

我正在写一个应用程序,我需要覆盖模型的默认路由助手。所以如果我有一个名为Model的模型,用相应的helper model_path()生成“/ model/[id]”。我想重写该助手来生成“/something/[mo​​del.name]”。我知道我可以在视图助手中做到这一点,但有没有办法在路由级别覆盖它?覆盖Rails默认路由助手

回答

3

范围您可以在模型定义to_param。它的返回值将在生成的URL中用作id。

class Thing 
    def to_param 
    name 
    end 
end 

的您可以将您的路线,像这样

scope "/something" do 
    resources :things 
end 

或者适应范围你的资源,你也可以使用子资源是适用的。

最后你需要修改你的控制器,因为Thing.find(params[:id])不会工作。

class ThingsController < ApplicationController 
    def show 
    @thing = Thing.where(:name => params[:id).first 
    end 
end 

你可能想确保你的Thingname是独一无二的,你会看到奇怪的事情,如果它不是。

要实现这一切的节省自己的麻烦,你可能也有兴趣friendly_id,让你这和一些额外的行为(例如使用产生的蛞蝓)

+0

好!正是我在找什么 - 谢谢! – tpalmer 2012-03-16 20:15:30

0

您需要的routes.rb

scope "/something" do 
    resources :models 
end 
+0

是的,但我不希望ID在路径中 - 不会添加该范围创建一个像“/something/model/[model.id]”的路径?我需要它看起来像“/something/[mo​​del.name]”,而不是 – tpalmer 2012-03-16 14:29:23

+0

好吧,所以你需要不宁静的路径而不是 – MikDiet 2012-03-16 14:37:32

+1

像'get“something /:name”=>“models#show”,:as => :model' – MikDiet 2012-03-16 14:39:58