Как удалить .xml и .json из url при использовании активного ресурса
Когда я делаю сопоставление в активном ресурсе, его запрос по умолчанию к Ruby on Rails всегда автоматически добавляет расширение в конце URL-адреса.
Например:
Я хочу получить пользовательский ресурс из Ruby on Rails путем сопоставления, как показано ниже:
class user < 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