Rails:我们什么时候必须把::在某些类之前放入rails了解基类

时间:2016-08-07 11:58:50

标签: ruby-on-rails ruby

在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可以理解它是基类吗?

由于

1 个答案:

答案 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