我正在编写一个应用程序,我需要覆盖模型的默认路由助手。因此,如果我有一个名为Model的模型,则使用相应的帮助程序model_path()生成“/ model / [id]”。我想覆盖该帮助程序以生成“/something/[model.name]”。我知道我可以在视图帮助器中执行此操作,但有没有办法在路由级别覆盖它?
答案 0 :(得分: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
您可能希望确保name
的{{1}}是唯一的,因为如果不是,您会发现奇怪的事情。
为了避免麻烦自己实现所有这些,你可能也会对friendly_id感兴趣,它会给你这个和一些额外的行为(例如使用生成的slu))
答案 1 :(得分:0)
您需要routes.rb中的范围
scope "/something" do
resources :models
end