对同一对象使用多个路由

时间:2014-05-21 18:13:38

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

在Rails中,默认路由使用内部数据库ID来标识资源,因此最终会得到以下路由:

/user/1/widget/4

可以更改这些内容以使用:id easily enough之外的其他内容,以便您可以使用以下路线:

/user/bob/widget/favorites

但是有没有办法让两者都可用?我问,因为在我的情况下,我使用该路线创建了一个与外部服务一起使用的唯一ID,但我希望它们基于id以外的字段,因为它&# 39;将这些替代ID传递给外部服务更有用。

我当然可以构建一些自定义的东西,但是我们目前有一些代码可以按照以下方式工作(顶部有其他便利功能;这是核心功能),以获得我必须构建的大部分功能。免费的#39;来自Rails:

class PathIdParser
  def initialize
    @context = Application.routes
  end

  def parse(path)
    @context.recognize_path(path)
  end

  def build(route, params)
    @context.named_routes[route].format(params)
  end
end

显然build函数很容易通过改变传递给params哈希值的值来使用其他路由,但有没有办法可以parserecognize_path使用这些备用字段来查找资源,因为to_param似乎根据{{1}}返回的值工作。

2 个答案:

答案 0 :(得分:0)

在routes.rb

get 'user/:username/widget/favourites', to: 'users#favourites'

这将路由' user / bob / widget / favorites'到UsersController的收藏夹操作,您可以通过

访问用户名
@username = params[:username]

答案 1 :(得分:0)

在模型中使用方法to_param()。

它返回一个String,Action Pack用它来构造此对象的URL。默认实现将此记录的id作为String返回,如果此记录未保存,则返回nil。

class User < ActiveRecord::Base
  def to_param  
    name
  end
end

user = User.find_by_name('Richard')

user_path(user)  # => "/users/Richard"