2009-05-20 58 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 })