导入模块的未定义方法

时间:2017-05-29 16:13:15

标签: ruby-on-rails ruby

我在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导航到该方法。为什么不解决方法?我错过了什么?

3 个答案:

答案 0 :(得分:1)

我认为您不需要添加xhr.onreadystatechange = function() { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { alert("Error 1"); } else { alert("Error 2"); loadWeatherError(); options.error("There is a problem receiving the latest weather. Try again."); } var data = JSON.parse(xhr.responseText); if (data.response) { //deal with wunderground api } else { //deal with Yahoo api alert("Error 2"); loadWeatherError(); options.error("There is a problem receiving the latest weather. Try again."); } } }; 来使用BasesHelper方法。只需使用像这样的方法名称

available_bases

在控制器中导入def index available_bases end 模块时,控制器中将提供BasesHelper的所有方法。所以你可以通过调用(没有模块名称)名称来使用这些方法。

如果您想提高代码质量并遵循铁路惯例,请查看Gerry的答案。

答案 1 :(得分: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视图中使用。

答案 2 :(得分:-1)

这是因为您的方法available_basesBasesHelper的实例方法,而不是类方法。你把它称为类方法。

如果您想使用available_bases类方法,extend类而不是include - 。

class BasesController < ApplicationController
  extend BasesHelper
  ...
end