如何使用浅嵌套路由的ActiveResource?

Ric*_*aca 15 rest activeresource

我有一个Rails应用程序,其公司资源具有嵌套资源 Employee.我正在使用浅层路由,所以要操纵Employee,我的路由是:

GET     /employees/1
PUT     /employees/1
DELETE  /employees/1
POST    /companies/1/employees
Run Code Online (Sandbox Code Playgroud)

如何使用ActiveResource创建,读取,更新和销毁员工?

要创建员工,我可以使用:

class Employee < ActiveResource::Base
  self.site = "http://example.com/companies/:company_id"
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试做:

e=Employee.find(1, :params => {:company_id => 1})
Run Code Online (Sandbox Code Playgroud)

我得到404,因为在使用浅路由时未定义route/companies /:company_id/employees /:id.

要阅读,编辑和删除员工,我可以使用:

class Employee < ActiveResource::Base
  self.site = "http://example.com"
end
Run Code Online (Sandbox Code Playgroud)

但由于缺乏公司外部路线,似乎没有办法创建新的员工.

一种解决方案是定义单独的CompanyEmployee和Employee类,但这似乎过于复杂.

如何在ActiveResource中使用单个Employee类来执行所有四个CRUD操作?

ace*_*des 14

我正在使用Rails 3.0.9.您可以像这样设置前缀:

class Employee < ActiveResource::Base
  self.prefix = "/companies/:company_id/"
end
Run Code Online (Sandbox Code Playgroud)

然后

Employee.find(:all, :params => {:company_id => 99})
Run Code Online (Sandbox Code Playgroud)

要么

e = Employee.new(:name => "Corey")
e.prefix_options[:company_id] = 1
Run Code Online (Sandbox Code Playgroud)

它将使用prefix_options中的值替换:company_id.


小智 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
Run Code Online (Sandbox Code Playgroud)

然后,您就可以创建员工.

e = Employee.new(:name => "Corey")
e.prefix_options[:company_id] = 1
e.save
Run Code Online (Sandbox Code Playgroud)

似乎除了克隆方法之外,还没有记录prefix_options,因此在将来的版本中可能会更改.

  • 应该使用`self.prefix ="/ companies /:company_id /"`而不是覆盖`collection_path` (4认同)