16

入れ子になったリソースEmployeeを持つ Company リソースを持つ Rails アプリケーションがあります。私は浅いルーティングを使用しているので、従業員を操作するには、私のルートは次のとおりです。

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

浅いルートが使用されている場合、ルート /companies/:company_id/employees/:id が定義されていないため、404 が返されます。

従業員の読み取り、編集、および削除には、次を使用できます。

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

しかし、会社の外部ルートがないため、新しい従業員を作成する方法はないようです。

解決策の 1 つは、CompanyEmployee クラスと Employee クラスを別々に定義することですが、これは非常に複雑に思えます。

ActiveResource で単一の Employee クラスを使用して、4 つの CRUD 操作すべてを実行するにはどうすればよいですか?

4

4 に答える 4

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 の値に置き換えます。

于 2011-07-26T20:39:15.947 に答える
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

clone メソッド以外では prefix_options が文書化されているようには見えないので、これは将来のリリースで変更される可能性があります。

于 2009-05-22T02:27:42.697 に答える
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 })
于 2012-08-10T15:06:29.317 に答える