Ruby on rails 使用<;时的类继承:

Ruby on rails 使用<;时的类继承:,ruby-on-rails,ruby,Ruby On Rails,Ruby,REST API railscast具有以下代码示例: module Api module V1 class ProductsController < ApplicationController class Product < ::Product def as_json(options={}) super.merge(released_on: released_at.to_date) end en

REST API railscast具有以下代码示例:

module Api
  module V1
    class ProductsController < ApplicationController
      class Product < ::Product
        def as_json(options={})
          super.merge(released_on: released_at.to_date)
        end
      end
    end
  end
end
模块Api
模块V1
类ProductsController<应用程序控制器
类别产品<::产品
def as_json(选项={})
超级合并(发布日期:发布日期:截止日期)
结束
结束
结束
结束
结束
我在以下方面遇到问题:

  class Product < ::Product
类产品<::产品
是吗?当我尝试在irb中重新创建类似的内容时,我得到:

module Fooirb(main):001:0> module Foobar
irb(main):002:1> class Product < ::Product
irb(main):003:2> end
irb(main):004:1> end
NameError: uninitialized constant Product
    from (irb):2:in `<module:Foobar>'
    from (irb):1
模块Fooirb(主):001:0>模块Foobar
irb(主要):002:1>类别产品<::产品
irb(主):003:2>结束
irb(主):004:1>结束
NameError:未初始化的常量乘积
from(irb):2:in`'
来自(irb):1

标记
表示一个名称空间,如果之前没有使用任何标记,它将访问顶级名称空间。例如,以这个小程序为例:

class Bar
  def initialize
    puts "New ingot created"
  end
end

module Foo
  class Bar
    def initialize(location)
      puts "New bar built in #{location}".
    end
  end

  def self.new_bar(which)
    if which == :top
      Bar.new("Rubytown, USA")
    else
      ::Bar.new
    end
  end
end
如果调用
Foo.new\u bar(:top)
,则会打印消息
new bar内置于美国Rubytown
。如果您改为使用,比如说,
Foo.new\u bar(:place\u to\u drink)
它将打印
创建的新铸块

此代码起作用:

class Product
end

module Foo
  class Product < ::Product
  end
end

含义相同。

Product在顶级命名空间中查找产品类。在本例中,它正在访问现有模型。从rails转换:

我们要做的是在ProductsController中创建一个新的Product类,该类继承自现有的Product模型类,并在其中进行更改

<意味着继承自

::表示名称空间,但如果以::开头,则表示没有名称空间


类产品<::Product表示类产品继承自当前名称空间之外的另一个类产品

关于您的错误,不要使用
irb
使用
rails控制台
(irb不加载rails应用,请参阅)

我认为您的解释(最后一句)应该是相反的。如果您调用
Foo.new\u bar(:top)
,它应该打印
“美国鲁比镇的新酒吧”
啊,很漂亮。修复了它。
class Object::Product
end

module Object::Foo
  class Object::Foo::Product < Object::Product
  end
end