2012-09-26 10 views

risposta

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

Avanti, che si sta per chiedere come ottenere un elemento da un URL che guarda a ActiveResource essere //foo.com/user.json invece di //foo.com/user/.json

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

Modifica in risposta al commento

c'è un modo per farlo senza dover inserire l'URL completo della richiesta ogni volta che voglio usare find()?

Un modo è definire un metodo nella classe per eseguire l'URL completo.

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 

Un altro modo è ridefinire elemento_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 

Alcuni chiamerebbero questa patch di scimmia, altri la chiamerebbero Programmazione orientata agli oggetti. Dico che è solo patch-scimmia quando entrate nel codice o usate la natura dinamica di Ruby per cambiare il comportamento di base e questo è un modo totalmente legittimo di fare cose nella programmazione orientata agli oggetti. Tuttavia, la comunità di Ruby non usa molto OOP, ignorando praticamente l'ereditarietà in favore di mix-in molto meno tolleranti (e meno ben educati), e usando solo la tipizzazione anatra per il polimorfismo.

I problemi relativi alla necessità di creare conflitti con ActiveResource per creare un URL in cui non è possibile ridefinire il servizio Web per accettare le convenzioni di ActiveResource è perché molti utilizzano invece HTTParty. "Se si deve costruire l'URL, potrebbe anche usare HTTParty"

+0

C'è un modo per fare questo senza dover inserire l'URL completo della richiesta ogni volta che voglio usare find()? –

+0

Hai chiesto per questo. Risposta modificata. –

+1

Potresti usare 'site' e' prefix' per comporre anche la prima parte dell'URL. – funwhilelost

2

Se è necessario solo per sbarazzarsi di nome della risorsa pluralizzazione nell'URL, sovrascrivono collection_name:

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

    def self.collection_name 
    element_name 
    end 
end