2014-03-26 6 views
6

Ich habe den Controller-Code durch Vererbung DRY'd.Rails Controller - Erben einer benutzerdefinierten Aktion

class MastersController < ApplicationController 
    def index 
    ... 
    ... 
    end 

    ... 
    ... 
end 

class ItemsController < MastersController 
end 

Jetzt habe ich eine benutzerdefinierte Aktion zum MastersController hinzugefügt

class MastersController < ApplicationController 
    def index 
    ... 
    ... 
    end 

    ... 
    ... 

    def clone 
    ... 
    ... 
    end 
end 

ich hinzugefügt haben, die Routen für Artikel

resources :items do 
    get :clone 
end 

Jetzt, wenn ich versuche myapp.dev/items/ zugreifen 1/Klon, ich bekomme den Fehler

AbstractController::ActionNotFound at /items/1/clone 
The action 'clone' could not be found for ItemsController 

Screenshot

Wenn ich die Aktion 'Klon' in ItemsController hinzufüge, verschwindet der Fehler.

class ItemsController < MastersController 
    def clone 
    ... 
    ... 
    end 
end 

Wie abstrahiere ich eine benutzerdefinierte Aktion in Rails Controller?

+0

Eine weitere Frage auf um das gleiche Thema http://stackoverflow.com/questions/22604996/rails-controller-inheritance-vs -concerns-and-mixins –

+0

Könnte das eine Antwort sein? http://stackoverflow.com/questions/3998286/inheriting-and-routing-a-custom-action-from-applicationcontroller-in-rails (Tadmans Antwort) –

+0

ist "Klon" unter jeder privaten Methode? Versuchen Sie, das Wort "public" eine Zeile über "def clone" hinzuzufügen – gabrielhilal

Antwort

0

Es ist nicht möglich, clone als eine Aktion zu verwenden, die von einem übergeordneten Controller geerbt wird. Dies gilt für ApplicationController zusätzlich zu Ihrem MastersController.

Benennen Sie Ihre Aktion um in copy und Sie können es in MastersController definieren und korrekt an ItemsController#copy routen.

Bitte beachten Sie, ich kann Ihnen nicht sagen, warum das ist. Es gibt eine Ruby-Methode clone, die in der Klasse Object definiert ist. Ich vermute, das ist der Grund - vielleicht könnte jemand mit mehr Wissen erklären.

+0

Es gibt eine Clone-Methode für ActiveRecord. Mein Code sieht fast so aus. def copy @master = @ master.clone rendern: neues Ende –

+0

Es ist jetzt nur Dokumentation; Ich denke, dass die Methode in v2.3 veraltet war.8 und es fällt jetzt direkt auf Rubys Objekt-Klon. –

+0

Danke. Es hat nicht funktioniert. Ich habe es korrigiert. –

2

Sie können es verwenden, wie diese

def clone 
    super 
    end 

in Ihrem Kind-Controller

Verwandte Themen