ruby-on-rails - 如何使用 ActiveSupport::Concern 继承类方法

标签 ruby-on-rails ruby inheritance activesupport-concern

我的 Ruby on Rails 应用程序中有一个小的类层次结构。我试图用一些我希望子类继承的信息来添加对描述类的支持的关注。这个问题可以用这个小样本来说明:

module Translatable
  extend ActiveSupport::Concern

  included do
  end

  module ClassMethods
    def add_translatable_fields(field_and_types)
      @translatable_fields ||= {}
      @translatable_fields.merge! field_and_types
    end

    def translatable_fields
      @translatable_fields
    end
  end
end

class Item
  include Translatable

  add_translatable_fields({name: :string})
end

class ChildItem < Item
end

class AnotherItem < Item
  add_translatable_fields({description: :text})
end

puts "Item => #{Item.translatable_fields.inspect}"
puts "ChildItem => #{ChildItem.translatable_fields.inspect}"
puts "AnotherItem => #{AnotherItem.translatable_fields.inspect}"

我希望这个示例代码能够返回

Item => {name: :string}
ChildItem => {name: :string}
AnotherItem => {name: :string, description: :text}

但不幸的是,ChildItem 和 AnotherItem 没有添加在父类上设置的类“属性”,而是返回

Item => {name: :string}
ChildItem => nil
AnotherItem => {description: :text}

如何使类继承按我希望的方式工作?

最佳答案

看起来子类正确地从父类继承,但问题是类变量

我打赌你能做到

class ChildItem < Item
  add_translatable_fields(Item.translatable_field)
end

但我刚刚了解到这些 Rails 助手,它似乎更像是您要找的东西。

http://api.rubyonrails.org/classes/Class.html#method-i-class_attribute

您可以在包含的 block 中定义 class_attribute,它应该按照您希望的方式继承给所有子级。

关于ruby-on-rails - 如何使用 ActiveSupport::Concern 继承类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368833/

相关文章:

ruby-on-rails - 使用 cucumber 停用功能

ruby-on-rails - 其中(:sku => 'sku123' ) vs where ('sku =

ruby-on-rails - 有没有一种不太尴尬的方法来在 Ruby 哈希中存储值?

ruby - 在子文件夹中运行 `bundle` 系统命令

ruby-on-rails - 如何使用Rails连接到PostgreSQL容器

java - JAXB - 对动态标签名称使用继承

ruby-on-rails - 自动将参数附加到 *_url 或 *_path 方法(Rails)

ruby-on-rails - Heroku 检测到 Rails 未设置为提供 static_assets

objective-c - 输出正在调用方法的类的名称的最佳方式是什么?

java - 基本的 Java 继承/数组。如何将子类变量与数组一起使用