2009-05-20 20 views
15

Possiedo un'applicazione Rails che dispone di una risorsa aziendale con un dipendente nested resource. Sto utilizzando superficiale di routing, in modo di manipolare i dipendenti, i miei percorsi sono:Come utilizzare ActiveResource con percorsi nidificati poco profondi?

GET  /employees/1 
PUT  /employees/1 
DELETE /employees/1 
POST /companies/1/employees 

Come posso creare, leggere, aggiornare e distruggere dipendenti che utilizzano ActiveResource?

Per creare dipendenti, posso usare:

class Employee < ActiveResource::Base 
    self.site = "http://example.com/companies/:company_id" 
end 

Ma se provo a fare:

e=Employee.find(1, :params => {:company_id => 1}) 

ho ottenere un 404 perché il percorso/aziende /: company_id/dipendenti /: id non è definito quando vengono utilizzati percorsi poco profondi.

di leggere, modificare e cancellare i dipendenti, posso usare:

class Employee < ActiveResource::Base 
    self.site = "http://example.com" 
end 

Ma poi non sembra essere un modo per creare nuovi dipendenti, a causa della mancanza delle compagnie percorso esterno.

Una soluzione potrebbe essere quella di definire classi separate di CompanyEmployee e Employee, ma ciò sembra eccessivamente complesso.

Come è possibile utilizzare una singola classe Employee in ActiveResource per eseguire tutte e quattro le operazioni CRUD?

risposta

10

C'è un metodo di istanza protetto denominato percorso_condazione che è possibile sovrascrivere.

class Employee < ActiveResource::Base 
    self.site = "http://example.com" 

    def collection_path(options = nil) 
    "/companies/#{prefix_options[:company_id]}/#{self.class.collection_name}" 
    end 
end 

Si sarebbe quindi in grado di creare dipendenti.

e = Employee.new(:name => "Corey") 
e.prefix_options[:company_id] = 1 
e.save 

Non sembra come i prefix_options è documentato diverso nel metodo clone quindi questo potrebbe cambiare nelle versioni future.

+0

lavorano alla grande, ad eccezione avevo bisogno di usare "/ aziende/# {prefix_options [: company_id]} /#{self.class.collection_name},xml "o il POST non è stato interpretato come XML. –

+4

dovrebbe usare 'self.prefix ="/companies /: company_id/"' invece di sovrascrivere 'collection_path' – tybro0103

14

Sto usando Rails 3.0.9. È possibile impostare il prefisso in questo modo:

class Employee < ActiveResource::Base 
    self.prefix = "/companies/:company_id/" 
end 

E poi

Employee.find(:all, :params => {:company_id => 99}) 

o

e = Employee.new(:name => "Corey") 
e.prefix_options[:company_id] = 1 

andrà a sostituire: company_id con il valore da prefix_options.

0

si veda questo articolo: http://blog.flame.org/2009/11/04/activeresource-and-shallow-nested-routes.html

Qui, l'autore si propone di sostituire il metodo della classe collection_path. Questo ha senso, poiché questo metodo viene utilizzato anche da new_element_path e recupererà lo stesso percorso in entrambi i casi.

Esempio:

class Employee < ActiveResource::Base 
    self.site = "http://example.com" 

    def self.collection_path(prefix_options = {},query_options=nil) 
    super 
    "/companies/#{query_options[:company_id]}/#{collection_name}.#{format.extension}#{query_string(query_options)}" 
    end 
end 

allora si può trovare dipendenti per una società facendo:

company = Company.find(:first) 
Employee.find(:all, :params => {:company_id => company.id }) 
Problemi correlati