2014-03-26 56 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