Railsのresource_controllerプラグインを使用しています。UsersControllerとProjectsController内にネストされたReleasesControllerがあります。
Resource_controllerは、ユーザーからリリースをプルしようとすると失敗しますが、プロジェクトからは成功します。Userでの問題は、Releaseの結果が、ReleaseではなくEnumerable::Enumeratorタイプのオブジェクトになることです。プロジェクトの下でリリースを見つける同じプロセスにより、正しいリリースインスタンスが識別されます。
r_cコードを掘り下げて、ネットメソッド呼び出しを見つけました。これは、スクリプト/コンソール内で問題を再現しました。
>> Project.first.releases.find 17
=> #<Release id: 17, project_id: 1, name: "FORTEEN", lock_version: 10, deleted_at: nil, created_at: "2009-06-22 17:56:10", updated_at: "2009-06-22 19:48:47">
>> User.first.releases.find 17
=> #<Enumerable::Enumerator:0x599e29c>
もちろん、Enumerable::Enumeratorで使用されるReleaseメソッドはすべて失敗します。リリースメソッドの定義は次のとおりです。
User:
def projects
# active is a named_scope on Project
employer ? employer.projects.active : Project.active
end
def releases
projects.collect { |p| p.releases }.flatten
end
Project:
has_many :releases, :dependent => :destroy
ProjectsControlerでUser.projectsメソッドを問題なく使用しています。問題はUser.releasesメソッドの定義にあると思いますが、修正方法の提案に感謝します。
これが私のルート定義です:
map.resources :projects do |project|
project.resources :releases, :member => { :restore => :get }
end
map.resources :releases,
:member => { :restore => :get },
:except => [ :new, :create ]
map.resources :users, :member_path => '/:id', :nested_member_path =>
'/:user_id' do |user|
user.resources :projects
user.resources :releases,
:member => { :restore => :get },
:except => [ :new, :create ]
end
ありがとう!dr