2009-06-23 9 views
0

Ich benutze das Rails Resource_Controller-Plugin. Ich habe einen ReleasesController, der in einem UsersController und einem ProjectsController verschachtelt ist.Rails Verschachtelte Ressourcenzugriffsproblem in Resource_Controller

Resource_controller schlägt fehl, wenn es versucht, die Freigabe von User zu ziehen, aber von Project erfolgreich ist. Das Problem unter Benutzer besteht darin, das Release-Ergebnis in einem Objekt vom Typ Enumerable :: Enumerator und nicht in einem Release zu finden. Derselbe Prozess, um ein Release unter Project zu finden, führt zur Identifizierung der richtigen Release-Instanz.

der R_c Code Graben durch, ich habe ruft die Netto-Methoden herausgefunden, das ich das Problem innerhalb Skript/Konsole dupliziert haben:

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

Jede Methode Release auf dem Enumerable verwendet :: Enumerator schlägt fehl , Na sicher. Hier sind die Definitionen der Freigabemethoden:

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 

Ich benutze die User.projects-Methode im ProjectsControler ohne Schwierigkeit. Ich vermute, das Problem liegt in der Definition der User.releases-Methode, aber ich schätze Vorschläge zur Behebung.

Hier sind meine Route Definitionen:

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 

Dank!

dr
+0

Wenn Sie die Definition der Routen zeigen, könnte es helfen. – jcoffey

+1

Ich würde hinzufügen, dass ich denke, das spezielle Problem bezieht sich auf User.Releases, die ein tatsächliches Array eher als einen Verbandsproxy zurückgeben, den ich denke, r_c erwartet. –

+0

Wegdefinitionen: map.resources: Benutzer,: member_path => '/: id',: nested_member_path => '/: user_id' do | user | user.resources: Projekte user.resources: Mitteilungen, : member => {: restore =>: get}, : außer => [: neu,: create] Ende map.resources: Projekte tun | Projekt | project.resources: Mitteilungen: member => {: restore =>: get} Ende map.resources: Mitteilungen, : member => {: restore =>: get}, : außer => [: neu,: erstellen] –

Antwort

1

Meine Lösung war, um die Differenz der Rückkehr Strukturen zu arbeiten:

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 

Nicht mein Ideal, würde ich eher der Lage sein, durch die end_of_associaition_chain.find arbeiten() und nicht die Objektmethode außer Kraft setzen .

Verwandte Themen