2015-11-09 2 views
1

Я новичок в Ruby on Rails, и я сломал себе голову на автозагрузках Rails.Пример автозагрузки Rails

У меня есть подобный код в моем /app/helpers/posts_helper.rb:

module PostsHelper 
    def markdown_render(data) 
    Utils::Markdown.render data 
    end 
end 

И я /app/utils/markdown.rb что-то вроде:

module Utils 
    class Markdown 
    class << self 
     def render(data) 
     # render some dataz 
     end 
    end 
    end 
end 

Согласно http://guides.rubyonrails.org/autoloading_and_reloading_constants.html, Utils::Markdown будет загружен из /app/utils/markdown.rb, но вместо этого я получаю :

ActionView::Template::Error: 
     uninitialized constant PostsHelper::Utils 

Я понимаю, что проблема заключается в ссылке на Utils из вспомогательного модуля, но у меня есть нулевые идеи, как правильно сделать эту ссылку.

Пожалуйста, помогите мне, прежде чем моя голова падает! = -)

+0

Вы можете удалить [тег: автозагрузка] и [tag: ruby-on-rails] из этого вопроса, на самом деле это не связано. Ваша проблема - просто рубиновый ** постоянный поиск **. (Хотя, конечно, без автозагрузки вы должны использовать 'require') –

+0

Согласно http://guides.rubyonrails.org/autoloading_and_reloading_constants.html, поиск констант Ruby и автозагрузка Rails совсем разные, поэтому я бы предпочел их оставаться. = -) – StragaSevera

ответ

0

Хорошо, я как-то понял.

Путь к приложению/some_name «пережеван» из поиска модулей/классов, поэтому Rails не ожидает найти в app/some_name/some_class.rb , он просто ожидает найти SomeClass.

Я перестроил файл ierarchy, так что теперь это: приложение/модули/Utils/my_markdown.rb, и это правильно автозагрузки Utils::MyMarkdown от my_markdown.rb = -)

1

Try:

module PostsHelper 
    def markdown_render(data) 
    ::Utils::Markdown.render data 
    end 
end 

, который, поставить двойное двоеточие перед Utils::Markdown. Это в основном означает «смотреть в корневое пространство имен», а не «искать в пространстве имен, в котором я сейчас».

+0

Нет. ':: Utils :: Markdown.render data' =>' ActionView :: Template :: Ошибка: неинициализированные константы Utils'. – StragaSevera

+0

«Я понимаю, что проблема заключается в ссылке на Utils из вспомогательного модуля» - оказывается, это не проблема. Я только что проверил, если вы поместили весь код из обоих файлов в /app/helpers/posts_helper.rb, он работает. Таким образом, проблема в том, что Rails не автоматически загружает его. Не знаю, почему, простите! –

+0

Хорошо, спасибо в любом случае = -) – StragaSevera

0

В markdown.rb просто определите Markdown как класс верхнего уровня (т. Е. Не в каких-либо пространствах имен).

+1

Rails должен автоматически автоматически загружать: «Все подкаталоги приложения в приложении и машинах. Например, приложения/контроллеры. Они не обязательно должны быть стандартными, любые настраиваемые каталоги, такие как приложения/рабочие автоматически принадлежат autoload_paths ". (из http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths) –

+0

@ joshua.paling Спасибо за ваш комментарий. Обновлен мой ответ. – Aetherus

+0

Это работает, спасибо. Но я не хочу загрязнять глобальное пространство имен такими полезными классами и методами, я хочу держать его в порядке. Есть ли способ реализовать такой вариант использования? – StragaSevera

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