2017-05-29 88 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