2009-05-20 39 views
15

我有一個Rails應用程序,它有一個公司資源nested resource員工。我使用的是淺路由,所以操作員工,我的航線有:如何使用淺層嵌套路線的ActiveResource?

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

我怎麼可以創建,讀取,更新和使用的ActiveResource破壞員工?

要創建的員工,我可以使用:

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

但是,如果我嘗試做:

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

我收到了404,因爲其路由/公司/:COMPANY_ID /員工/:ID在使用淺層路線時未定義。

閱讀,編輯和刪除的員工,我可以使用:

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

但後來似乎沒有要創建新員工,由於缺乏公司外路線的方式。

一個解決方案是定義單獨的CompanyEmployee和Employee類,但這看起來過於複雜。

如何在ActiveResource中使用單個Employee類來執行所有四個CRUD操作?

回答

10

有一個名爲collection_path的受保護實例方法,您可以覆蓋它。

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 

然後,您可以創建員工。

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

它看起來好像沒有記錄prefix_options,除了在克隆方法中,所以這可能會在將來的版本中改變。

+0

偉大的工作,但我需要使用「/公司/#{prefix_options [:COMPANY_ID]} /#{self.class.collection_name},xml「或POST不解釋爲XML。 – 2009-05-23 01:59:02

14

我正在使用Rails 3.0.9。從prefix_options值的company_id:您可以設置這樣的前綴:

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

然後

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

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

它將取代。

0

看到這篇文章:http://blog.flame.org/2009/11/04/activeresource-and-shallow-nested-routes.html

在這裏,筆者提出重寫類方法collection_path。這是有道理的,因爲這個方法也被new_element_path使用,並且在兩種情況下都會檢索相同的路徑。

例子:

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 

然後你就可以做找到一個公司員工:

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