rails routes中使用自定义的params

写接口的时候,遇到的一个问题。

问题描述

通常情况下,通过ID来查找instance,类似这样:

resources :books do
  get :publish_info, on: :member
end

想要查找某本书详细的出版信息时,URL长这样:

/books/{book_id}/publish_info

假定现在要求传递的是商品的序列号ISBN,而不是book.id,怎么写?

解决方法

在rails的routes部分有介绍,类似这样:

get 'books/*section/:title', to: 'books#show'

get 'photos/:id', to: 'photos#show', id: /[A-Z]\d{5}/

可以用其他字段来代替id,且可以给字段添加上正则校验。

比如上面的ISBN,可以这么写:

resources :books, params: :isbn do
  get :publish_info, on: :member
end

同时参考RegExLib.com, ISBN 10 or 13 对应的正则表达式是^(97(8|9))?\d{9}(\d|X)$ ,故可以添加上正则校验:

resources :books, params: :isbn, isbn: %r{^(97(8|9))?\d{9}(\d|X)$} do
  get :publish_info, on: :member
end

OK。

参考

Rails Routing from the Outside In

Rails Patch: Change the Name of the :id Parameter in Routing Resources

Slash usage in to_param results in escaped character and no route match with 4.1.2 upgrade

RegExLib.com