#ruby-on-rails #api #rest #activeresource
#ruby-on-rails #API #остальное #activeresource
Вопрос:
При использовании ActiveResource вызов MyObject.find(id) получает «[self.site]/[self.prefix]/:id.[self.format]». Однако API, к которому мы обращаемся, настроен немного по-другому. Вместо id.file_type нам нужно получить доступ к «[self.site]/:id/[self.suffix].[self.format]».
ie: получить http://api_path/:id/tool.json
Есть ли какой-либо способ настроить activeresource для этого сценария? Я мало что нахожу в документации.
Ответ №1:
ActiveResource::Base.element_path
это метод, который создает путь:
def element_path(id, prefix_options = {}, query_options = nil)
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
"#{prefix(prefix_options)}#{collection_name}/#{URI.escape id.to_s}.#{format.extension}#{query_string(query_options)}"
end
Я бы создал класс, который переопределяет element_path, что-то вроде этого:
class CustomApiPath < ActiveResource::Base
def element_path(id, prefix_options = {}, query_options = nil)
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
"#{prefix(prefix_options)}#{URI.escape id.to_s}/#{collection_name}.#{format.extension}#{query_string(query_options)}"
end
end
(предупреждение: не проверено) и тогда другие модели ActiveResource будут наследоваться от CustomApiPath, а не ActiveResource::Base.