Как удалить .xml и .json из url при использовании активного ресурса

Когда я делаю сопоставление в активном ресурсе, его запрос по умолчанию к Ruby on Rails всегда автоматически добавляет расширение в конце URL-адреса. Например: Я хочу получить пользовательский ресурс из Ruby on Rails путем сопоставления, как показано ниже:

class user &lt ActiveResource::Base
  self.site = 'http://localhost:3000'
end

И что-то, что мне нужно, я просто хочу, чтобы он передавал URL-адрес без расширения, например

 http://localhost:3000/user
В контраст автоматически добавляет расширение в конце URL-адреса, например
 http://localhost:3000/user.xml

Как я могу опустить расширение URL-адреса, когда я делаю запрос из активного сопоставления ресурсов?

Ответ 1

Сначала я использовал ответ @Joel AZEMAR, и он работал достаточно хорошо, пока я не начал использовать PUT. Выполнение PUT добавлено в .json/.xml.

Немного исследование здесь, показало, что использование опции ActiveResource::Base#include_format_in_path работало намного лучше для меня.

Без include_format_in_path:

class Foo < ActiveResource::Base
  self.site = 'http://localhost:3000'
end

Foo.element_path(1)
=> "/foo/1.json"

С include_format_in_path:

class Foo < ActiveResource::Base
  self.include_format_in_path = false
  self.site = 'http://localhost:3000'
end

Foo.element_path(1)
=> "/foo/1"

Ответ 2

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

Добавьте этот lib в каталог /lib/active _resource/extend/, не забудьте раскомментировать "config.autoload_paths + =% W (# {config.root}/lib)" в 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

Ответ 3

Вы можете сделать это, переопределив два метода ActiveResource в своем классе:

class User < ActiveResource::Base
  class << self
    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}#{query_string(query_options)}"
    end

    def collection_path(prefix_options = {}, query_options = nil)
      prefix_options, query_options = split_options(prefix_options) if query_options.nil?
      "#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}"
    end
  end

  self.site = 'http://localhost:3000'
end