2016-08-07 10 views
1

In Ruby, verstehe ich, dass ::ClassName für den Aufruf der Klasse am Basismodul. Zum Beispiel, hier ist mein Code:Rails: wann müssen wir setzen :: bevor einige Klassen für Schienen Basisklasse verstehen

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 

Wenn ich laufe, treffe ich Ausnahme:

NoMethodError (nicht definierte Methode `erstellen‘ für HHT :: V1 :: OfflineCheckIn: Module)

Wie ich verstehe, verstehen Schienen, dass OfflineCheckIn derzeit in Modul HHT::V1::OfflineCheckIn, so muss ich bei der Basisklasse ::OfflineCheckIn anrufen. Die Sache, die ich nicht verstehe, ist: bei einem anderen Controller, einige vorherige Programmierer implementiert den gleichen Weg mit mir, aber er muss :: vor Modell nicht anrufen.

Also meine Frage ist: wann brauchen wir nicht :: vor der Klasse und Schienen können verstehen, dass das ist Basisklasse?

Dank

Antwort

2

Sie haben Klasse als ::ClassName zu nennen, wenn in der Hierarchie eine Klasse/Modul mit dem gleichen Namen gibt es zwischen ihnen, zum Beispiel zu unterscheiden:

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 

Hier haben wir ::Foo und ::Bar::Foo, aber Kurzschrift Foo verweist auf einen von ihnen abhängig vom Kontext.

Auch spielt es keine Rolle, ob die Entitäten Klassen oder Module sind, sind beide nur als Wert für eine Konstante zugewiesen:

module Foo; end 

module Bar 
    Foo = "a string" 

    def self.baz 
    puts Foo.class 
    end 
end 

puts Foo.class # => Module 
Bar.baz # => String 
+0

gibt es andere Fälle? Mein Projekt hat nur eine Datei mit der Klasse 'OfflineCheckIn'. Aber es gibt ein Modul namens 'OfflineCheckIn' im' offline_check_in' -Verzeichnis. Wird dies Auswirkungen auf Schienen haben, wie Klasse verstehen? –

+0

@ TrầnKimDự eigentlich ist es egal, ist das Ding eine Klasse oder ein Modul, in der Tat, beide sind als Wert für eine Konstante gespeichert – Vasfed