在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
哈希值的值来使用其他路由,但有没有办法可以parse
到recognize_path
使用这些备用字段来查找资源,因为to_param
似乎根据{{1}}返回的值工作。
答案 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"