Удалить расширение .xml из запроса ActiveResource - PullRequest
14 голосов
/ 21 июля 2010

Я пытаюсь использовать ActiveResource для получения XML-данных от стороннего API. Я могу использовать приложение RESTClient для успешной аутентификации и отправки запросов. Я закодировал свое приложение, и когда я делаю запрос, я получаю ошибку 404. Я добавил:

ActiveResource::Base.logger = Logger.new(STDERR) 

к моему файлу development.rb и выяснил проблему. API отвечает данными xml на запросы, которые НЕ заканчиваются на xml. Например, это работает в RESTClient:

https://api.example.com/contacts

но ActiveResource отправляет этот запрос вместо

https://api.example.com/contacts.xml

Есть ли в любом случае "хороший" способ убрать расширение из запроса, генерируемого ActiveResource?

Спасибо

Ответы [ 4 ]

11 голосов
/ 07 декабря 2013

Вы можете исключить строку формата из путей с помощью:

class MyModel < ActiveResource::Base
  self.include_format_in_path = false
end
6 голосов
/ 25 мая 2011

Вы можете переопределить методы ActiveResource :: Base

Добавьте эту библиотеку в каталог / lib / active_resource / extend /, не забудьте раскомментировать
"config.autoload_paths + =% W (# {config.root} / lib)" in config / application.rb

module ActiveResource #:nodoc:
  module Extend
    module WithoutExtension
      module ClassMethods
        def element_path_with_extension(*args)
          element_path_without_extension(*args).gsub(/.json|.xml/,'')
        end
        def new_element_path_with_extension(*args)
          new_element_path_without_extension(*args).gsub(/.json|.xml/,'')
        end
        def collection_path_with_extension(*args)
          collection_path_without_extension(*args).gsub(/.json|.xml/,'')
        end
      end

      def self.included(base)
        base.class_eval do
          extend ClassMethods
          class << self
            alias_method_chain :element_path, :extension
            alias_method_chain :new_element_path, :extension
            alias_method_chain :collection_path, :extension
          end
        end
      end  
    end
  end  
end

в модели

class MyModel < ActiveResource::Base
  include ActiveResource::Extend::WithoutExtension
end
6 голосов
/ 22 июля 2010

Возможно, вам необходимо переопределить метод element_path в вашей модели.

В соответствии с API текущее определение выглядит следующим образом:

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}/#{id}.#{format.extension}#{query_string(query_options)}"
end

Удаление. # {format.extension} может делать то, что вам нужно.

4 голосов
/ 04 августа 2012

Гораздо проще переопределить методы доступа _path, упомянутые в в этом ответе , для каждого отдельного класса, чем для монтирования исправлений в приложении ActiveResource, которое может мешать другим ресурсам или драгоценным камням, которые зависит от ActiveResource.

Просто добавьте методы прямо в ваш класс:

class Contact < ActiveResource::Base

  def element_path
    super.gsub(/\.xml/, "")
  end

  def new_element_path
    super.gsub(/\.xml/, "")
  end

  def collection_path
    super.gsub(/\.xml/, "")
  end
end

Если вы обращаетесь к нескольким ресурсам RESTful в одном и том же API, вы должны определить свой собственный базовый класс, в котором может находиться общая конфигурация. Это гораздо лучшее место для пользовательских _path методов:

# app/models/api/base.rb
class Api::Base < ActiveResource::Base
  self.site     = "http://crazy-apis.com"
  self.username = "..."
  self.password = "..."
  self.prefix   = "/my-api/"

  # Strip .xml extension off generated URLs
  def element_path
    super.gsub(/\.xml/, "")
  end
  # def new_element_path...
  # def collection_path...
end

# app/models/api/contact.rb
class Api::Contact < Api::Base

end

# app/models/api/payment.rb
class Api::Payment < Api::Base

end

# Usage:

Api::Contact.all()      # GET  http://crazy-apis.com/my-api/contacts
Api::Payment.new().save # POST http://crazy-apis.com/my-api/payments
...