写接口的时候,遇到的一个问题。
问题描述
通常情况下,通过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