ruby-on-rails - Ruby on Rails 和类变量混淆

标签 ruby-on-rails ruby oop ruby-on-rails-4 class-variables

我在 Rails 中有一个模型,它有一个枚举属性“status”。我想要一个公共(public)和私有(private)状态的概念,如下所示:

class Something < ActiveRecord::Base
  @public_statuses = [:open, :closed, :current]
  @private_statuses = [:deleted]

  enum status: @public_statuses + @private_statuses
end

这样我就可以在 View 中执行以下操作:

<select>

<% Something.public_statuses.each do |status| %>
    <option value="<%= status %>"><%= status.humanize %></option>
<% end %>

</select>

这样,我就不会向最终用户公开私有(private)状态。

不幸的是,我不太了解 Ruby 类,无论我是否使用 @public_statuses、@@public_statuses、public_statuses=[...] 等,都无法使其正常工作。我熟悉 Java 和其他 OO语言,但就是不知道如何使用 Ruby 在这里。

执行此操作的正确方法是什么?

最佳答案

您可以将变量视为类方法,并将您不希望被访问的变量定义为私有(private)(这在 Ruby 中并非绝对正确)。喜欢:

    def self.public_statuses
        [:open, :closed, :current]
    end

    def self.private_statuses
        [:deleted]
    end

    private_class_method :private_statuses

但是如果你真的要使用变量,在本例中是常量,它非常相似:

PUBLIC_STATUSES = [:open, :closed, :current]
PRIVATE_STATUSES = [:deleted]
private_constant :PRIVATE_STATUSES

所以,你可以使用它:

puts Something::PUBLIC_STATUSES
=> [:open, :closed, :current]
puts Something::PRIVATE_STATUSES
NameError: private constant Client::PRIVATE_STATUSES referenced

关于ruby-on-rails - Ruby on Rails 和类变量混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277775/

相关文章:

c++ - 如何使我的 C++ 类事件系统成为限于类型数组的模板类?

ruby-on-rails - Rails - 事件记录 : add extra select column to find(:all)

ruby-on-rails - 如何将所有RoR模型的include_root_in_json设置为false?

javascript - 用户索引页面上的 Ajax 按钮未更新 - Rails 教程 4

ruby-on-rails - 用于安全支付的最佳支付网关和 Rails gem?

ruby-on-rails - 如何在我的种子数据中创建相同的记录 X 次?

ruby-on-rails - 设置 mina 时出错

ruby - 在 Ruby 中计算 Base-n 对数

c# - PHP 中的部分类就像我们在 C# 中一样

java - 工厂方法模式是模板方法模式的特例吗?