2009-05-20 1 views
15

У меня есть приложение Rails, которое имеет ресурс компании с сотрудником nested resource. Я использую неглубокую трассировку, чтобы манипулировать Employee, мои маршруты:Как использовать 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/сотрудников /: ид не определяется, когда используются мелкие маршруты.

Чтобы читать, редактировать и удалять сотрудников, я могу использовать:

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

Но не кажется, что должен быть способ для создания новых сотрудников, из-за отсутствия компаний внешнего маршрута.

Одним из решений было бы определить отдельные классы CompanyEmployee и Employee, но это кажется слишком сложным.

Как я могу использовать один класс Employee в ActiveResource для выполнения всех четырех операций 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. –

+4

должен использовать 'self.prefix ="/companies /: company_id/"' вместо переопределения 'collection_path' – tybro0103

14

Я использую Rails 3.0.9. Вы можете установить префикс, как это:

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 

Он заменит: company_id со значением от prefix_options.

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 }) 

 Смежные вопросы

  • Нет связанных вопросов^_^