如何制作可在 Rails 应用程序中的任何地方使用的自定义方法

use*_*745 2 ruby ruby-on-rails ruby-on-rails-5

我希望创建一个自定义方法(例如def plus_two(x) x + 2 end,让它在应用程序内的任何地方都可以访问——也就是说,可以在控制器、模型、控制台、视图、测试和任何其他.rb文件中访问。我目前在许多领域定义了相同的方法的应用程序,并希望使其干燥

如何做到这一点?

注意:我不介意调用该方法是否需要预先添加某些内容(我已经看到一些答案,其中方法预先带有::名称空间或带有名称空间,但除此之外,我更喜欢在可能的情况下保持代码简洁

我已经阅读了一些类似的问题(例如这个),但我不太明白

spi*_*ann 6

阅读评论似乎您只是在寻找一个清晰而简单的方法示例,该示例在您的应用程序中随处可用:

# in app/models/calculator.rb
module Calculator
  def self.plus_two(x) 
    x + 2 
  end
end
Run Code Online (Sandbox Code Playgroud)

可以这样调用:

Calculator.plus_two(8)
#=> 10
Run Code Online (Sandbox Code Playgroud)

  • 能够做到这一点对我来说是一个重大突破(我已经阅读了 90 多个论坛帖子和大约 20 个 SO 问题,但在提问之前无法做到)。一个后续问题,而不是 1 个方法,假设我有 10 个我想定义,我是否会将它们全部放入单独的文件中(例如 `calculator.rb`、`abacus.rb` 等),或者我可以以某种方式放入一个文件中有多种方法?什么是最佳实践? (2认同)
  • @user5783745 是的!您可以将多个方法放在同一个模块中,也可以创建更多模块。您了解类和模块之间的区别吗?在某些情况下,您可能会发现想要使用类而不是模块。此外,您可能需要查看 ActiveSupport Concerns,这是 Rails 将功能“混合”到类中的方法。如果您有想要包含在多个模型中的功能,它们会很方便。https://api.rubyonrails.org/classes/ActiveSupport/Concern.html (2认同)
  • @user5783745:可以向这样的模块添加更多方法,并且您可以拥有多个模块。在这种方法中,我将使用不同的模块来对方法进行分组以将它们组织起来。在一个文件中包含太多方法很难阅读和理解。您可能希望根据方法的用途或它们处理的数据类型来组织方法。但是这样的结构完全取决于我们的应用程序和您的域。 (2认同)