2009-04-20 6 views
10

Lorsque je fais un mappage dans une ressource active, sa requête par défaut sur le Ruby on Rails ajoute toujours automatiquement l'extension à la fin de l'URL. Par exemple: Je veux obtenir des ressources utilisateur de Ruby on Rails par correspondance comme ci-dessous:Comment faire pour supprimer .xml et .json de l'URL lors de l'utilisation de la ressource active

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

Et quelque chose que j'ai besoin, je veux juste passer l'URL sans extension comme

http://localhost:3000/user
En revanche, il ajoute automatiquement la extension à la fin de l'URL comme
http://localhost:3000/user.xml

Comment puis-je omettre l'extension de l'URL lorsque je demande à partir du mappage de ressources actif?

Répondre

3

Vous pouvez le faire en remplaçant deux méthodes de ActiveResource dans votre classe:

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

Vous pouvez remplacer les méthodes de ActiveResource :: Base

Ajouter cette lib/lib/active_resource/extension/répertoire don « oubliez uncomment
"config.autoload_paths + =% W (# {config.root}/lib)" dans 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 

dans le modèle

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

Au début, je ne ai pas utilisé la réponse de @Joel AZEMAR et cela a fonctionné très bien jusqu'à ce que je commencé à utiliser PUT. Faire un PUT ajouté dans le fichier .json/.xml.

Un peu de research here, a révélé que l'utilisation de l'option ActiveResource::Base#include_format_in_path a fonctionné beaucoup mieux pour moi.

Sans include_format_in_path:

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

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

Avec 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

Cela fonctionne bien et est beaucoup plus propre que les autres solutions. Merci. – MrTheWalrus

Questions connexes