ruby-on-rails - Ruby 风格问题 : storing hash constant with different possible values

标签 ruby-on-rails ruby

这更像是一个风格问题,我想知道其他人是怎么做的。

假设我的数据库中有一个名为“status”的字段用于博客文章。我希望它有几个可能的值,例如“草稿”、“等待审核”和“已发布”。

显然我们不想每次都在这些魔法值中“硬编码”,那样不会很干。

所以我有时做的是这样的:

class Post
  STATUS = {
    :draft => "draft",
    :awaiting_review => "awaiting review",
    :posted => "posted"
  }

  ...

end

然后我以后可以编写引用它的代码,如 STATUS[:draft]Post::STATUS[:draft]

这工作正常,但有一些我不喜欢的地方。

  1. 如果您输入错误并调用类似 STATUS[:something_that_does_not_exist] 的代码,它不会抛出错误,它只会返回 nil,并且可能会在您之前在数据库中设置它,等等曾经注意到一个错误
  2. 写类似 if some_var == Post::STATUS[:draft] ...

我不知道,有些东西告诉我有更好的方法,但只是想看看其他人是怎么做的。谢谢!

最佳答案

您可以使用 Hash.new 并为其提供一个 block 参数,如果 key 未知则调用该参数。

class Post
  STATUS = Hash.new{ |hash, key| raise( "Key #{ key } is unknown" )}.update(
    :draft => "draft",
    :awaiting_review => "awaiting review",
   :posted => "posted" )
end

它有点乱,但它有效。

irb(main):007:0> Post::STATUS[ :draft ]
=> "draft"
irb(main):008:0> Post::STATUS[ :bogus ]
RuntimeError: Key bogus is unknown
    from (irb):2
    from (irb):8:in `call'
    from (irb):8:in `default'
    from (irb):8:in `[]'
    from (irb):8

关于ruby-on-rails - Ruby 风格问题 : storing hash constant with different possible values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106955/

相关文章:

ruby-on-rails - Rake 和 RVM 的 Ruby 2.5.0 警告

ruby-on-rails - pjax -- 链接必须在 pjax 容器内吗?

ruby-on-rails - 如何删除嵌套在不同范围内的重复路由?

ruby - 在 Ruby 中,使用 "def initialize ( value = ' ') 初始化类实例有什么好处?

ruby-on-rails - rails formtastic - 以枚举为下拉列表的整数字段 - '0' 无效

ruby-on-rails - 如何识别未使用的 i18n key ?

ruby-on-rails - Rails 3.2.13 recognize_path 返回约束的路由错误

ruby - 是否可以在不先获取远程 git repo 信息的情况下获取它?

用于显示长数组的 Ruby 样式

ruby - HttpGenericRequest 中 body 与 body_stream 的区别