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,因此在将来的版本中可能会更改.