【问题标题】:Overriding Rails Default Routing Helpers覆盖 Rails 默认路由助手
【发布时间】:2012-04-02 02:17:43
【问题描述】:

我正在编写一个需要覆盖模型的默认路由助手的应用程序。因此,如果我有一个名为 Model 的模型,其对应的帮助程序 model_path() 会生成“/model/[id]”。我想覆盖该助手以生成“/something/[mo​​del.name]”。我知道我可以在视图助手中执行此操作,但有没有办法在路由级别覆盖它?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您可以在模型上定义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 感兴趣,它为您提供了这个和一些额外的行为(例如,使用生成的 slug)

    【讨论】:

      【解决方案2】:

      您需要 routes.rb 中的范围

      scope "/something" do
        resources :models
      end
      

      【讨论】:

      • 是的,但我不希望路径中的 id - 添加该范围不会创建类似“/something/model/[model.id]”的路径?我需要它看起来像“/something/[mo​​del.name]”
      • 嗯,这让我非常接近 - 我仍然看到由 model_path() 生成的 url 中的 id。我希望能够访问 model.name 而不是默认为 model.id
      猜你喜欢
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2014-07-02
      • 1970-01-01
      相关资源
      最近更新 更多