2009-04-20 5 views
10

Cuando realizo una asignación en el recurso activo, su solicitud predeterminada a Ruby on Rails siempre agrega automáticamente la extensión al final de la url. Por ejemplo: quiero llegar usuario recurso de rubí en los carriles mediante mapeo de la siguiente manera:Cómo eliminar .xml y .json de la url cuando se utiliza el recurso activo

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

Y algo que necesito, sólo quiero pasar la URL sin extensión como

http://localhost:3000/user
En contraste añade automáticamente el extensión al final de la url como
http://localhost:3000/user.xml

¿Cómo puedo omitir la extensión de la url cuando realizo una solicitud desde la asignación de recursos activo?

Respuesta

3

Usted puede hacer esto por razones imperiosas de dos métodos de ActiveResource en su clase:

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 
4

Puede reemplazar los métodos de ActiveResource :: Base

Añadir este lib/lib/active_resource/extensión/directorio de Don 't olvidar uncomment
"config.autoload_paths + =% W (# {config.root}/lib)" en 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 

en el modelo

class MyModel < ActiveResource::Base 
    include ActiveResource::Extend::WithoutExtension 
end 
11

Al principio, hice uso de la respuesta de @ Joel AZEMAR y funcionó bastante bien hasta que empecé a usar PUT. Realizando una PUT agregada en .json/.xml.

Un poco de research here, reveló que usar la opción ActiveResource::Base#include_format_in_path funcionó mucho mejor para mí.

Sin include_format_in_path:

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

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

Con 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

Esto funciona bien, y es mucho más limpia que las otras soluciones. Gracias. – MrTheWalrus

Cuestiones relacionadas