ruby-on-rails - view教程 - ruby调试




Ruby on Rails:在哪里定义全局常量? (8)

一些选项:

使用常数:

class Card
  COLOURS = ['white', 'blue', 'black', 'red', 'green', 'yellow'].freeze
end

使用类实例变量延迟加载:

class Card
  def self.colours
    @colours ||= ['white', 'blue', 'black', 'red', 'green', 'yellow'].freeze
  end
end

如果它是一个真正的全局常量( 尽管避免了这种性质的全局常量 ),那么也可以考虑在config/initializers/my_constants.rb放置一个顶级常量。

我刚开始使用我的第一个Ruby on Rails web应用程序。 我有很多不同的模型,视图,控制器等等。

我想找到一个合适的地方来粘贴真正的全局常量的定义,这些定义适用于整个应用程序。 特别是,它们都适用于我的模型逻辑以及我的观点所作的决定。 我找不到任何干燥的地方把这些定义放在他们可用于所有模型和我所有观点的地方。

举一个具体的例子,我想要一个常量COLOURS = ['white', 'blue', 'black', 'red', 'green'] 。 这被用在所有地方,在模型和视图中。 我可以在哪里将它定义在一个地方以便可以访问?

我试过的:

  • model.rb文件中与它们最相关的常量类变量,例如@@COLOURS = [...] 。 但是我找不到一个理智的方式来定义它,这样我就可以在我的视图Card.COLOURS写入,而不是像Card.first.COLOURS这样的Card.first.COLOURS
  • 模型上的一种方法,就像def colours ['white',...] end一样 - 同样的问题。
  • application_helper.rb中的方法 - 这是我迄今为止所做的,但助手只能在视图中访问,而不能在模型中访问
  • 我想我可能在application.rb或environment.rb中尝试了一些东西,但这些看起来并不正确(而且它们似乎也不工作)

有没有办法定义任何模型和视图都可以访问的东西? 我的意思是,我知道模型和视图应该是分开的,但是在某些领域肯定会有时需要引用相同的领域特定知识?


从Rails 5.0开始,您可以直接使用configuration对象进行自定义配置

config/application.rb (或者config/custom.rb如果你愿意的话)

config.colours = %w(white blue black red green)

它将以下列形式提供:

Rails.configuration.colours # => ["white", "blue", "black", "red", "green"]

注意:对于4.2版本,您需要使用config.x属性:

config.x.colours = %w(white blue black red green)

这将可用作为:

Rails.configuration.x.colours # => ["white", "blue", "black", "red", "green"]

全局变量应该在config/initializers目录中声明

COLOURS = %w(white blue black red green)

另一个选项,如果你想在一个地方定义你的常量:

module DSL
  module Constants
    MY_CONSTANT = 1
  end
end

但仍然可以使其全局可见,而无需以完全合格的方式访问它们:

DSL::Constants::MY_CONSTANT # => 1
MY_CONSTANT # => NameError: uninitialized constant MY_CONSTANT
Object.instance_eval { include DSL::Constants }
MY_CONSTANT # => 1

如果在一个以上的类中需要一个常量,我总是将它放在config / initializers / contant.rb中(下面的状态列表被截断)。

STATES = ['AK', 'AL', ... 'WI', 'WV', 'WY']

除了模型代码之外,它们都可以在应用程序中使用:

    <%= form.label :states, %>
    <%= form.select :states, STATES, {} %>

要在模型中使用常量,请使用attr_accessor使常量可用。

class Customer < ActiveRecord::Base
    attr_accessor :STATES

    validates :state, inclusion: {in: STATES, message: "-- choose a State from the drop down list."}
end

对于应用程序范围的设置和全局常量,我建议使用Settingslogic 。 这些设置存储在YML文件中,可以从模型,视图和控制器访问。 更多..你可以为你所有的环境创建不同的设置:

  # app/config/application.yml
  defaults: &defaults
    cool:
      saweet: nested settings
    neat_setting: 24
    awesome_setting: <%= "Did you know 5 + 5 = #{5 + 5}?" %>

    colors: "white blue black red green"

  development:
    <<: *defaults
    neat_setting: 800

  test:
    <<: *defaults

  production:
    <<: *defaults

视图中的某处(我更喜欢这种类型的辅助方法),或者在模型中可以获得,例如,颜色数组Settings.colors.split(/\s/) 。 它非常灵活。 而且你不需要发明一辆自行车。


我通常在我的rails程序中有一个'lookup'模型/表,并将其用于常量。 如果常数对于不同的环境会有所不同,这是非常有用的。 另外,如果你有计划扩展它们,比如说你希望在以后的日期添加'黄色',你可以简单地在查找表中添加一个新行并完成它。

如果您授予管理员权限修改此表,他们将不会来维护您。 :)干。

以下是我的迁移代码的外观:

class CreateLookups < ActiveRecord::Migration
  def change
    create_table :lookups do |t|
      t.string :group_key
      t.string :lookup_key
      t.string :lookup_value
      t.timestamps
    end
  end
end

我使用seeds.rb预先填充它。

Lookup.find_or_create_by_group_key_and_lookup_key_and_lookup_value!(group_key: 'development_COLORS', lookup_key: 'color1', lookup_value: 'red');

根据你的情况,你也可以定义一些环境变量,并通过ruby代码中的ENV['some-var']获取它,这个解决方案可能不适合你,但我希望它可以帮助其他人。

示例:您可以创建不同的文件.test_env.test_env.test_env并根据您的应用程序环境加载它,请检查此dotenv-rails自动为您设置。





global