【问题标题】:Where should I store calculated values I use throughout my application in Rails?我应该在哪里存储我在 Rails 中的整个应用程序中使用的计算值?
【发布时间】:2010-10-07 00:49:17
【问题描述】:

我有以下变量定义:

@monday = (Time.now).at_beginning_of_week

我在不同的模型、控制器和视图中使用它。

我在哪里可以定义它(以及我应该如何定义它——@@?),这样我就可以定义它一次并在我的 Rails 应用程序中使用?

应该在 environment.rb 中吗?应该是@@?

【问题讨论】:

    标签: ruby-on-rails variables environment-variables


    【解决方案1】:

    我会将它添加到应用程序控制器中:

    before_filter :load_date
    
    def load_date
      @monday =  (Time.now).at_beginning_of_week
    end
    

    所以它可以在你所有的控制器和视图中访问。如果你想在你的模型中使用它,那么你可能需要它作为一些参数,例如范围。然后你的控制器就是你应该将这个变量传递给模型的地方:

    @models = MyModel.before_date(@monday)
    

    我认为您不需要为整个应用程序只拥有此变量的一个实例。初始化它非常简单。初始化它并且不使用它时也不好。对我来说,很难想象你的所有控制器和动作都需要它。

    另一种方式是你可以定义类:

    class MyDate
      def self.get_monday
        Time.now.at_beginning_of_week
      end
    end
    

    并把它放在config/initializers(可能有更好的地方放它)。然后您可以从应用程序中的任何位置访问它:

    MyDate::get_monday
    

    【讨论】:

    • 它在大约三个控制器和视图中(我认为只有一个模型)——但我注意到我在三个不同的鞋带中对它的定义不同,所以想让它干燥。如果我把它放在 /lib 文件中会起作用吗?该文件是否必须命名为 my_date.rb?
    【解决方案2】:

    使用 environment.rb 定义这个值不是你想要的,因为这个值会在服务器启动时计算出来,之后会保持不变。如果你希望每周刷新一次值,这是个问题。

    我会使用 ApplicationController 中的类变量 (@@)。但这在模型中是不可访问的。

    你可以做的是创建一个新模块,在这个模块中定义这个值,然后在任何需要它的控制器或模型中混入这个模块。因此,您将拥有 MyModule::start_of_week 的值。只需确保在每个请求上都设置此值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2017-05-30
      • 2012-03-09
      • 2018-06-09
      • 2010-12-14
      • 2015-02-21
      • 1970-01-01
      • 2010-11-10
      相关资源
      最近更新 更多