访问子文件夹的方法&类

时间:2016-05-03 19:22:50

标签: ruby-on-rails ruby

在我的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文件。

所以这不是重复。

1 个答案:

答案 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)调用此类帮助程序,尽管记住关注点分离是明智的(视图逻辑保留在视图帮助程序中,持久性逻辑和模型中的数据访问,以及控制器中特定于行动的业务逻辑,而不是“将所有内容都包含在所有内容中”,因为它看起来很方便。