在Ruby中,我理解::ClassName
用于在基本模块中调用类。例如,这是我的代码:
module HHT
module V1
module OfflineCheckIn
class PutOfflineCheckInProductsApi < ApplicationApi
put 'offline' do
ActiveRecord::Base.transaction do
OfflineCheckIn.create(check_in_param) # exception here
end
end
end
end
end
end
当我跑步时,我遇到异常:
NoMethodError(未定义的方法`create'for HHT :: V1 :: OfflineCheckIn:模块)
据我了解,Rails理解OfflineCheckIn
当前位于模块HHT::V1::OfflineCheckIn
内部,因此我必须在基类::OfflineCheckIn
中调用。我不明白的是:在另一个控制器上,一些以前的程序员对我实现了相同的方式,但他不需要在模型之前调用::
。
所以我的问题是:当我们不需要在课前使用::
并且rails可以理解它是基类吗?
由于
答案 0 :(得分:3)
如果您的层次结构中有一个具有相同名称的类/模块,则必须将类称为::ClassName
,以区分它们,例如:
class Foo; end
module Bar
class Foo; end # this is another Foo
def self.a
puts ::Foo == Foo
end
end
module FooBar
def self.a
puts ::Foo == Foo
end
end
Bar.a # => false
FooBar.a # => true
此处我们有::Foo
和::Bar::Foo
,但速记Foo
指向其中一个,具体取决于具体情况。
如果实体是类或模块也无关紧要,两者都被指定为常量的值:
module Foo; end
module Bar
Foo = "a string"
def self.baz
puts Foo.class
end
end
puts Foo.class # => Module
Bar.baz # => String