【发布时间】:2012-04-02 02:17:43
【问题描述】:
我正在编写一个需要覆盖模型的默认路由助手的应用程序。因此,如果我有一个名为 Model 的模型,其对应的帮助程序 model_path() 会生成“/model/[id]”。我想覆盖该助手以生成“/something/[model.name]”。我知道我可以在视图助手中执行此操作,但有没有办法在路由级别覆盖它?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
我正在编写一个需要覆盖模型的默认路由助手的应用程序。因此,如果我有一个名为 Model 的模型,其对应的帮助程序 model_path() 会生成“/model/[id]”。我想覆盖该助手以生成“/something/[model.name]”。我知道我可以在视图助手中执行此操作,但有没有办法在路由级别覆盖它?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-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
您可能希望确保您的Thing 的name 是唯一的,否则您会观察到奇怪的事情。
为了省去您自己实现所有这些的麻烦,您可能还对friendly_id 感兴趣,它为您提供了这个和一些额外的行为(例如,使用生成的 slug)
【讨论】:
您需要 routes.rb 中的范围
scope "/something" do
resources :models
end
【讨论】: