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

2023-12-05

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

我想找到一个好地方来保存真正全局常量的定义,这些常量适用于我的整个应用程序。特别是,它们既适用于我的模型的逻辑,也适用于我的观点所做出的决策。我找不到任何干燥的地方来放置这些定义,它们都可以使用all我的模型以及我所有的观点。

举个具体的例子,我想要一个常数COLOURS = ['white', 'blue', 'black', 'red', 'green']。这在模型和视图中随处可见。我可以在哪里将其定义在一处以便可以访问吗?

我尝试过的:

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

是否没有办法定义可从模型和视图访问的任何内容?我的意思是,我知道模型和视图应该是分开的,但是在某些领域中肯定有时它们需要引用相同的特定领域知识?


如果你的模型确实对常量“负责”,你应该把它们放在那里。您可以创建类方法来访问它们,而无需创建新的对象实例:

class Card < ActiveRecord::Base
  def self.colours
    ['white', 'blue']
  end
end

# accessible like this
Card.colours

或者,您可以创建类变量和访问器。然而,不鼓励这样做,因为类变量在继承和多线程环境中可能会表现得令人惊讶。

class Card < ActiveRecord::Base
  @@colours = ['white', 'blue'].freeze
  cattr_reader :colours
end

# accessible the same as above
Card.colours

如果需要,上面的两个选项允许您更改每次调用访问器方法时返回的数组。如果你有一个真正不可改变的常量,你也可以在模型类上定义它:

class Card < ActiveRecord::Base
  COLOURS = ['white', 'blue'].freeze
end

# accessible as
Card::COLOURS

您还可以创建可从初始化程序中的任何位置访问的全局常量,如下例所示。如果您的颜色确实是全局的并且在多个模型上下文中使用,这可能是最好的地方。

# put this into config/initializers/my_constants.rb
COLOURS = ['white', 'blue'].freeze

# accessible as a top-level constant this time
COLOURS

注意:当我们上面定义常量时,通常我们想要freeze数组。这可以防止其他代码稍后(无意中)通过例如以下方式修改数组:添加一个新元素。一旦对象被冻结,就无法再更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby on Rails:在哪里定义全局常量? 的相关文章

随机推荐

  • 如何将浏览器重定向到 ASP.NET 中的本地文件?

    我想要火狐浏览器打开C somefile txt在本地驱动器上 我尝试过使用 file 前缀的response redirect 但它只是插入 对象移到此处 进入页面 我还想对路径进行 htmlencode 因为它可能包含特殊字符 Edit
  • 如何创建类型列表的笛卡尔积?

    我想使用可变参数模板创建类型列表的叉积 这是我到目前为止所拥有的 include
  • Android:以编程方式更改按钮背景

    我有这个颜色资源文件
  • matplotlib 中使用 Latex 的无衬线数学

    以下脚本 import matplotlib matplotlib use Agg import matplotlib pyplot as mpl mpl rc font family sans serif mpl rc text uset
  • 300 000 000 000 的质因数?

    我需要找出超过3000亿的素因数 我有一个函数正在添加到它们的列表中 非常缓慢 现在它已经运行了大约一个小时 我认为它还有相当长的距离要静止 我这样做是完全错误的还是这是预期的 编辑 我试图找到数字 600851475143 的最大质因数
  • Jquery 移动后退按钮

    我有一个应用程序 在其中以编程方式向页面添加后退按钮 这意味着第一页上不会有后退按钮 然而 应用程序本身有多种进入应用程序的方式 换句话说 我可以收到通知 并且在触摸该通知时 它会转到应用程序中的特定区域 该区域不会有返回主页的后退按钮 如
  • 动态改变UITable单元格高度?

    我需要根据内容大小 长度调整单元格高度 尝试了几种方法 哪一种给出了准确的高度而不重叠 请参阅本教程进行更改UITableViewCell动态高度 调整 A UITableViewCell 大小 并使用本教程 uitableviewcell
  • 在keras中对合并层进行训练

    我正在实施以下this穆罕默德 哈瓦伊 Mohammad Havaei 的论文 它使用以下架构 我修改了一些代码here这样做 print Compiling two path model local pathway modle l Seq
  • 使用FJCore编码Silverlight WriteableBitmap

    我试图找出如何使用 FJCore 将 WriteableBitmap 编码为 jpeg 我知道 WriteableBitmap 提供原始像素 但我不确定如何将其转换为 FJCore 为其 JpegEncoder 方法期望的格式 JpegEn
  • 页脚位于页面底部或内容底部(以较低者为准)

    我有以下结构 div div
  • 在 javascript 中使用 webkit-playsinline

    如何在 javascript 中而不是 html5 视频标签中使用 webkit playsinline 我想像在 javascript 中使用视频标签控制 自动播放属性一样使用它 或者你们有其他有效的方法吗 我正在开发一个用于传输视频的
  • 即使手机处于锁定模式,活动也会显示

    我的问题与此类似如何让 Android 设备启动并跳过屏幕锁定 我想从广播接收器显示一个对话框 但 Android API 不允许我这样做 因此我正在使用从那里启动一个活动并将该活动的主题更改为 Theme 现在 即使手机处于锁定模式 睡眠
  • 当我的主选择使用 AJAX 更改时,如何刷新详细选择列表

    我正在寻找一些指示 我有一个包含主题列表的选择列表
  • Haskell:如何将多个实例放在同一个模块中?

    假设我有以下代码 import Data List Ordered data Person Person String String deriving Show Eq main IO main print show sort Person
  • CSS 伪类与 jQuery

    我刚刚学了一点 jQuery 并尝试用它来实现简单的变色效果 假设我有两个 div s foo 和 bar foo 有很多 URL 并且定义了以下 CSS foo a color blue border bottom 1px dashed
  • 使用 PDO 发送空值会导致错误

    我们有类似以下 PDO 语句 用于与 PostgreSQL 8 4 DB 进行通信 st db gt prepare INSERT INTO Saba Betriebskosten personalkosten VALUES kd pers
  • 捆绑已关闭,但我仍然想要版本控制

    我在 MVC4 中使用捆绑 或者更确切地说我was使用捆绑但不得不将其关闭 这意味着脚本和样式链接仅呈现在单独的行上 并且没有版本字符串以确保浏览器在有更新时下载最新文件 我尝试在捆绑代码中添加版本字符串 但随后收到一条错误消息 指出路径无
  • 如何在 Swift 中检查 Documents 目录中是否存在文件?

    如何检查文件是否存在于Documents目录中Swift 我在用 writeFilePath 方法将图像保存到文档目录中 我想在每次启动应用程序时加载它 但如果没有保存的图像 我有一个默认图像 但我就是不知道如何使用 func fileEx
  • 在单个数组对象上重写 toString() Javascript

    我有以下内容 var version 0 3 0 Override the version toString method version proto toString function return this join 哪个执行以下操作
  • Ruby on Rails:在哪里定义全局常量?

    我刚刚开始使用我的第一个 Ruby on Rails Web 应用程序 我有很多不同的模型 视图 控制器等等 我想找到一个好地方来保存真正全局常量的定义 这些常量适用于我的整个应用程序 特别是 它们既适用于我的模型的逻辑 也适用于我的观点所