我在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导航到该方法。为什么不解决方法?我错过了什么?
答案 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_bases
是BasesHelper
的实例方法,而不是类方法。你把它称为类方法。
如果您想使用available_bases
类方法,extend
类而不是include
- 。
class BasesController < ApplicationController
extend BasesHelper
...
end