在我的rails 4 app中,我的App文件夹中有一个子文件夹logic
,我在其中放置了不属于控制器或模型的类/方法。
但是,当我尝试从控制器访问这些方法时,我得到一个未知的方法错误。
这是logic
文件夹中的一个类:
class Analyze
def intent_determination(msg, context)
keywords = [["categories", "category"], ["brands", "brand"], ["stock", "stocks"], ["info", "information"], ["no"], ["yes"]]
tokenized_array = msg.split
keywords.each {|array| context["intent"] = array.first if (tokenized_array & array).any? }
context
end
def update_context(msg, session)
session.update(context: intent_determination(msg, session.context))
session.update(context: brand_determination(msg, session.context))
session.update(context: style_determination(msg, session.context))
session
end
end
如何在控制器中访问这些方法?
当我执行update_context(my_message, @session)
时,正如我所说,我得到一个未知的方法错误。
这是我的App文件夹结构:
App
Assets
Controllers
Logic
analyze.rb
Helpers
Mailers
Models
Views
编辑:
我添加了:
config.autoload_paths << Rails.root.join('app/logic/**/')
到我的application.rb文件。
所以这不是重复。
答案 0 :(得分:4)
您的var arr = [5,4,4,2,2,8]; // 6 4 2 1
var num = 0;
itemNum = countItemNotUndefined(arr);
function makeItemUndefine(arr) {
return arr.map(function(x){
x = x - 2;
return x ==0 || x == -1 ? undefined : x;
})
}
function countItemNotUndefined(arr) {
var itemLength = 0;
arr.map(function(x){
if(x !== undefined)
itemLength++;
})
return itemLength;
}
while(itemNum != 0) {
num ++;
var result = makeItemUndefine(arr);
itemNum = countItemNotUndefined(result);
}
console.log("Number is ", num);
方法是类update_context
中的实例方法。要调用它,您必须执行Analyze
。
您添加的行Analyze.new.update_context
告诉Rails从哪里开始寻找类和模块。这意味着Rails可以在不需要config.autoload_paths << Rails.root.join('app/logic/**/')
的情况下找到您的Analyze
类。
现在,您可能希望将require 'some/path'
作为类方法而不是实例方法,这样您就不需要使用update_context
实例化Analyze
对象。这很简单,只需在方法名称之前添加Analyze.new
:
self.
在这种情况下, class Analyze
def self.update_context(msg, session)
end
end
也可能是模块,而不是类,因为它的“实例”似乎并不代表任何东西混凝土。
无论是作为类还是模块,在将方法定义为Analyze
时,您都可以从应用中的任何位置执行def self.update_context
。
如果您正在寻找在视图中使用的辅助方法,请考虑将Analyze.update_context(...)
定义为update_context
内的方法。只需像你一样定义它(没有app/helpers/application.helper.rb
),你就可以从任何视图调用它而没有任何“前缀”(即你只需要self.
代替update_context
)。 Rails还允许您从控制器(请参阅here)和模型(请参阅here)调用此类帮助程序,尽管记住关注点分离是明智的(视图逻辑保留在视图帮助程序中,持久性逻辑和模型中的数据访问,以及控制器中特定于行动的业务逻辑,而不是“将所有内容都包含在所有内容中”,因为它看起来很方便。