Rails:我们什么时候必须把 :: 放在一些 Rails 类理解基类之前

Trầ*_* Dự 2 ruby ruby-on-rails

在 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
Run Code Online (Sandbox Code Playgroud)

当我运行时,我遇到了异常:

NoMethodError(HHT::V1::OfflineCheckIn:Module 的未定义方法“创建”)

据我了解,Rails 了解OfflineCheckIn当前在 module 内部HHT::V1::OfflineCheckIn,所以我必须在 base class 调用::OfflineCheckIn。我不明白的是:在另一个控制器上,一些以前的程序员与我实现了相同的方式,但他不需要::在模型之前调用。

所以我的问题是:当我们不需要使用::before class 并且 rails 可以理解那是 base class 时?

谢谢

Vas*_*fed 8

您必须调用类,::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
Run Code Online (Sandbox Code Playgroud)

这里我们有::Fooand ::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
Run Code Online (Sandbox Code Playgroud)