2014-03-26 57 views
6

我已经使用继承控制器代码。Rails控制器 - 继承自定义动作

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

    ... 
    ... 
end 

class ItemsController < MastersController 
end 

现在我已经加入了自定义操作的MastersController

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

    ... 
    ... 

    def clone 
    ... 
    ... 
    end 
end 

我已经添加了项目

resources :items do 
    get :clone 
end 

现在的路线,当我尝试访问myapp.dev/items/ 1 /克隆,我得到错误

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

Screenshot

如果我在ItemsController中添加'clone'操作,错误消失。

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

我如何抽象Rails中控制器的自定义操作?

+0

另一个问题是围绕同一主题http://stackoverflow.com/questions/22604996/rails-controller-inheritance-vs -concerns-and-mixins –

+0

这是一个答案吗? http://stackoverflow.com/questions/3998286/inheriting-and-routing-a-custom-action-from-applicationcontroller-in-rails(tadman的回答) –

+0

是'克隆'低于任何私人方法?尝试在'def clone'上面添加单词'public'一行' – gabrielhilal

回答

0

无法使用clone作为从父控制器继承的操作。除了您的MastersController之外,ApplicationController也是如此。

将您的操作重命名为copy,您将可以在MastersController中定义它并正确路由到ItemsController#copy

请注意,我不能告诉你为什么这是。在Object类中定义了一种Ruby方法clone。我怀疑这是原因 - 也许有更多知识的人可以解释。

+0

有一个ActiveRecord的克隆方法。我的代码几乎看起来像这样。 def copy @master = @ master.clone render:new end –

+0

现在它实际上只是文档;我认为该方法在v2.3中已被弃用。8,它现在直接传递给Ruby的'Object#clone'。 – 2014-03-26 16:51:14

+0

谢谢。它没有工作。我纠正了它。 –

2

你可以在你的孩子控制器使用这样

def clone 
    super 
    end