2017-05-29 123 views
0

未定義的方法我都下app/controllers進口模塊

require_relative '../../lib/bases_helper' 

class BasesController < ApplicationController 
    include BasesHelper 

    def index 
    BasesHelper.available_bases 
    end 
end 

我試圖用另一個模塊中定義的方法的控制器lib下:

module BasesHelper 
    def available_bases 
    @bases = Base.all 
    end 
end 

當我運行我的應用程序和訪問我得到一個錯誤

undefined method `available_bases' for BasesHelper:Module 

我可以導航到方法與我的IDE通過點擊它的名字。爲什麼它不解決方法?我錯過了什麼?

回答

1

我想你不需要加BasesHelper來使用available_bases的方法。只要使用方法名這樣

def index 
    available_bases 
end 

,正如你在控制器進口BasesHelper模塊的BasesHelper所有方法會在你的控制器使用。所以你可以使用這些方法只需調用(不包含它的模塊名稱)它的名字。

如果您想提高您的代碼質量並遵循導軌約定,請檢查Gerry的答案。

1

雖然Junan Chakma answer會工作,但我會建議不要這樣設置它。它更好(並遵循Rails約定)在控制器中使用私有方法並使用回調(即before_action);例如:

class BasesController < ApplicationController 
    before_action :set_available_bases, only: [:index] 

    def index 
    end 

    private 
    def set_available_bases 
    @bases = Base.all 
    end 
end 

這將設置@bases實例變量在您的index行動,index.html.erb視圖中使用。

+0

哇,這真的是大會嗎?我用(用Java)把東西從控制器中拿出來,這正是我想要做的。這看起來非常複雜。很高興知道,非常感謝! – garci560

+0

@nprensen是的,幫手更常用於觀點,儘管按你的方式做也不錯; Rails實際上喜歡_thin_控制器。事實上,我也使用這種方法來處理應用程序範圍的方法,例如會話(並在應用程序控制器中包含助手)。對於你的具體例子,由於'available_bases'方法只能被你的'bases_controlller'使用,所以把它放在控制器中是有意義的,大多數開發者都會這樣想。 – Gerry

-1

這是因爲您的方法available_basesBasesHelper的實例方法,而不是類方法。而且你稱它爲一個類方法。

如果你想使用available_bases像一個類的方法,extend該類而不是include -ing它。

class BasesController < ApplicationController 
    extend BasesHelper 
    ... 
end