0

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

4

1 に答える 1

1

私の解決策は、リターン構造の違いを回避することでした。

  def object
    # @object = end_of_association_chain.find(param) unless param.nil?
    # work-around r_c expectation of parent.releases result = Association proxy
    # use select block to filter out desired object rt. find
    @object ||= collection.select{ |o| o.id == param.to_i }.first unless param.nil?
    @object
  end

私の理想ではありませんが、end_of_associaition_chain.find()を介して作業し、オブジェクトメソッドをオーバーライドしないようにしたいと思います。

于 2009-06-25T19:34:49.313 に答える