2013-04-27 2 views
1

Я моделирую веб-приложение, где вы можете перейти на другую страницу приложения, щелкнув ссылку. Я решил сделать что-то вроде этого:Неинициализированная постоянная ошибка в скриптах Ruby

файл C:/Sandbox/common_page.rb:

require_relative "./pageA" 
require_relative "./pageB" 
require_relative "./pageC" 
require_relative "./pageD" 
class CommonPage 
    def pageA 
    # click_pageA_link 
    pageA.new 
    end 
    def pageB 
    # click_pageB_link 
    pageB.new 
    end 
    def pageC 
    # click_pageC_link 
    pageC.new 
    end 
    def pageD 
    # click_pageD_link 
    pageD.new 
    end 
    # and so on for other pages.. 
end 

файл C:/Sandbox/pageA.rb:

require_relative "./common_page" 
class PageA < CommonPage 
    def pageA 
    self 
    end 
end 

файл :

require_relative "./common_page" 
class PageB < CommonPage 
    def pageB 
    self 
    end 
end 

Аналогичный код будет представлен для классов, представляющих другие страницы. Если я запускаю файл C:/Sandbox/test.rb с этим кодом:

require_relative "./pageA" 
pA = PageA.new 

Я получаю эту ошибку:

C:/Sandbox/pageB.rb:2:in `<top (required)>': uninitialized constant CommonPage (NameError) 
    from C:/Sandbox/common_page.rb:2:in `require_relative' 
    from C:/Sandbox/common_page.rb:2:in `<top (required)>' 
    from C:/Sandbox/pageA.rb:1:in `require_relative' 
    from C:/Sandbox/pageA.rb:1:in `<top (required)>' 
    from C:/Sandbox/test.rb:1:in `require_relative' 
    from C:/Sandbox/test.rb:1:in `<main>' 

Похожие ошибки выскакивает также, когда я пытаюсь создать экземпляры других классов. Может ли кто-нибудь объяснить, что здесь происходит и как избежать этой проблемы?

ответ

3

Очевидно, что круговая зависимость не может быть выполнена. Если яйцу требуется курица, а куриные люки из яйца, то если у вас их еще нет, у вас их нет. Зачем нужен common_page.rbpageA? Удалите требует от common_page.rb, сделать отдельный my_project.rb, создать каталог my_project, переместить все другие файлы в нем, и требовать их от my_project.rb следующим образом:

require_relative 'my_project/common_page' 
require_relative 'my_project/pageA' 
require_relative 'my_project/pageB' 
require_relative 'my_project/pageC' 
require_relative 'my_project/pageD' 
3

Переместите требуемые строки в common_page в конец этого файла.

Проблема заключается в том, что для pageA требуется общая_страница, для которой требуется pageA (уже выполняется), для продолжения работы на common_page требуется страница B, которая, в свою очередь, требует common_page (уже выполняется), а затем переходит к ссылке CommonPage, которая еще не определена ,

+3

Что называется «циклическая зависимость». –

+0

@ Спасибо за объяснение! Является ли циркулярной ссылкой, которую я должен избегать в моем дизайне? Есть ли другой/лучший способ достичь того, что я хотел? – tom

Смежные вопросы