【问题标题】:Access subfolder's methods & classes访问子文件夹方法和类
【发布时间】:2016-08-29 00:04:56
【问题描述】:

在我的 rails 4 应用程序中,我的 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 文件。

所以这不是重复的。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

您的update_context 方法是Analyze 类中的一个实例方法。要调用它,您必须执行Analyze.new.update_context

您添加的config.autoload_paths << Rails.root.join('app/logic/**/') 行告诉Rails 从哪里开始寻找模块。这意味着 Rails 可以像这样找到您的 Analyze 类,而无需您执行 require 'some/path'

现在,您似乎希望将update_context 设为类方法而不是实例方法,这样您就无需使用Analyze.new 实例化Analyze 对象。这个很简单,只要在方法名前加上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 而不是Analyze.update_context) . Rails 还允许您从控制器(请参阅here)和模型(请参阅here)调用此类帮助程序,尽管记住关注点分离是明智的(视图逻辑保留在视图帮助程序、持久性逻辑和访问模型中的数据,以及控制器中特定于操作的业务逻辑),而不是“将所有内容包含在所有内容中”,因为它看起来很方便。

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2022-06-28
    • 2015-11-28
    • 2014-09-26
    • 2013-04-07
    相关资源
    最近更新 更多