Ruby on rails 使用<;时的类继承:
REST API railscast具有以下代码示例: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
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