2009-05-20 32 views
15

Tôi có ứng dụng Rails có tài nguyên Công ty với một nhân viên nested resource. Tôi đang sử dụng định tuyến nông, vì vậy để thao tác Nhân viên, các tuyến đường của tôi là:Làm thế nào để sử dụng ActiveResource với các tuyến đường được làm tổ?

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

Làm cách nào để tạo, đọc, cập nhật và hủy nhân viên sử dụng ActiveResource?

Để tạo nhân viên, tôi có thể sử dụng:

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

Nhưng nếu tôi cố gắng làm:

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

tôi nhận được một 404 vì con đường/công ty /: company_id/nhân viên /: id không được xác định khi sử dụng các tuyến đường nông.

Để đọc, chỉnh sửa và xóa nhân viên, tôi có thể sử dụng:

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

Nhưng sau đó dường như không thể là một cách để tạo nhân viên mới, do thiếu những công ty đường bên ngoài.

Một giải pháp là xác định các lớp Employee và Employee riêng biệt, nhưng điều này có vẻ quá phức tạp.

Tôi làm cách nào để sử dụng một lớp Employee trong ActiveResource để thực hiện tất cả bốn hoạt động CRUD?

Trả lời

10

Có phương pháp thể hiện được bảo vệ có tên collection_path mà bạn có thể ghi đè.

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 

Sau đó, bạn có thể tạo điều này cho nhân viên.

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

Có vẻ như prefix_options được ghi lại không phải trong phương pháp sao chép để điều này có thể thay đổi trong các bản phát hành trong tương lai.

+0

Làm việc lớn, ngoại trừ tôi cần phải sử dụng "/ công ty/# {prefix_options [: company_id]} /#{self.class.collection_name},xml "hoặc POST không được hiểu là XML. –

+4

nên sử dụng 'self.prefix ="/companies /: company_id/"' thay vì ghi đè 'collection_path' – tybro0103

14

Tôi đang sử dụng Rails 3.0.9. Bạn có thể thiết lập các tiền tố như thế này:

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

Và sau đó

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

hoặc

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

Nó sẽ thay thế: company_id với giá trị từ prefix_options.

0

Xem bài viết này: http://blog.flame.org/2009/11/04/activeresource-and-shallow-nested-routes.html

Ở đây, tác giả đề xuất để ghi đè phương thức lớp collection_path. Điều này có ý nghĩa, vì phương thức này cũng được new_element_path sử dụng và sẽ lấy cùng một đường dẫn trong cả hai trường hợp.

Ví dụ:

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 

Sau đó, bạn có thể tìm thấy nhân viên cho một công ty bằng cách thực hiện:

company = Company.find(:first) 
Employee.find(:all, :params => {:company_id => company.id }) 
Các vấn đề liên quan