2012-09-26 13 views

Respuesta

8
class User < ActiveResource::Base 
    self.element_name = "user" 
end 

A continuación, se le va a preguntar cómo llegar uno de los elementos de la dirección URL que se parece a ActiveResource ser //foo.com/user.json en lugar de //foo.com/user/.json

User.find(:one, :from => "https://foo.com/user.json?username=#{<USERNAME>}" 

Editar en respuesta al comentario

¿hay una manera de hacer esto sin tener que introducir la dirección URL completa de la solicitud cada vez que quiero usar find()?

Una forma es definir un método en la clase para hacer la URL completa para usted.

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.find_by_username(username) 
    find(:one, :from => "https://foo.com/user.json?username=#{username}" 
    end 

    def find 
    self.class.find(:one, :from => "https://foo.com/user.json?username=#{username}" 
    end 
end 

Otra forma es redefinir element_path.

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.element_path(id, prefix_options = {}, options = {}) 
    "https://foo.com/user.json?username=#{prefix_options["user_id"]}" 
    end 
end 

Algunos llamarían a este mono-parches, otros lo llamarían Programación Orientada a Objetos. Digo que es solo un parche para los monos cuando ingresas al código o usas la naturaleza dinámica de Ruby para cambiar el comportamiento básico y esta es una forma totalmente legítima de hacer las cosas en Programación Orientada a Objetos. Sin embargo, la comunidad de Ruby no usa demasiado OOP, prácticamente ignorando la herencia a favor de mezclas mucho más flexibles (y menos buenas), y solo usando pato-tipado para polimorfismo.

La cuestión de tener que meterse con ActiveResource para construir una URL donde no se puede redefinir el servicio web para aceptar las convenciones de ActiveResource es la razón por la que muchos están usando HTTParty en su lugar. "Si usted tiene que construir la URL, puede ser que también utilice HTTParty"

+0

¿Hay alguna manera hacer esto sin tener que ingresar la URL completa de la solicitud cada vez que quiera usar find()? –

+0

Lo pediste. Respuesta editada. –

+1

Puede usar 'site' y' prefix' para componer la primera parte de la URL también. – funwhilelost

2

Si sólo necesita deshacerse de nombre de recurso pluralización en la URL, anulan collection_name:

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.collection_name 
    element_name 
    end 
end 
Cuestiones relacionadas