【问题标题】:How to define an application-level global method to be used anywhere in Rails?如何定义在 Rails 中任何地方都可以使用的应用程序级全局方法?
【发布时间】:2023-03-24 12:04:01
【问题描述】:

我有一个方法current_org,它被简单地定义为:

def current_org
  Organization.find_by(subdomain: Apartment::Tenant.current)
end

无论是在视图、控制器、模型,甚至是服务中,它总是一样的。由于当前租户是从数据库连接派生的,因此我不必担心它的范围是否正确。而且我发现自己到处都在使用它。

在 Rails 中定义全局方法以便我可以从任何地方调用 current_org 的最佳方法是什么?目前我最好的解决方案是在/lib 中定义一个模块并用CustomHelperMethods.current_org 调用它。但我正在寻找更清洁的东西。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord methods global


    【解决方案1】:

    我会将它作为类方法放在 Organiation 模型中,或者创建一个特殊的服务/类来获取它。

    class Organization < ApplicationRecord
      def self.current_org
        find_by(subdomain: Apartment::Tenant.current)
      end 
    end
    

    # e.g. in app/services/
    class CurrentOrganization
      def self.current_org
        Organization.find_by(subdomain: Apartment::Tenant.current)
      end 
    end
    

    【讨论】:

    • 您可以在任何文件中定义它,只要确保它是手动需要的,因为此方法不会使用恒定分辨率自动加载。你可以例如在初始化程序 (config/intializers/) 中定义它,但我强烈建议将其保留在模块/类范围内。
    • 我希望能找到反对在模块外使用它的论据。您没有在全球应用程序环境中使用它的原因是什么?
    • 1.它使用 rails 的常量加载机制,所以它会在代码更改时重新加载(与其他常量一样)。 2. 如果不是对象/类,则更容易测试和模拟。 3、以后会更容易理解和跟踪。 4.如果任何对象定义了同名的方法,全局的将被隐藏。
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多