Для меня я бы использовал контроллер навигации, а не контроллер приложений, так как контроллер приложения легко становится чрезвычайно сложным.
Это должно создать папку представления в app/views/navigation
.Я также поместил бы здесь все свои шаблоны навигации (включая вашу главную навигацию).
Так что могут быть эти файлы:
app/views/navigation/
_main_nav.html.erb # made it a partial file for including in other pages
subnav.html.erb # or subnav.js.erb if you don ajax call and return scripts
и в ваших файлах макета, где вам нужна основная навигацияВы просто делаете это.
Так что даже завтра вам вдруг понадобятся два или три различных навигационных меню, и при вызовах ajax у вас есть централизованное место для их обработки, вместо того, чтобы помещать их все в контроллер приложения.
ДругоеЕще одно предложение - создать навигационный контроллер под некоторыми областями действия.Как и app/controllers/page_structures/navigation_controller.rb
, ваши представления будут в app/views/page_structures/navigation/
Таким образом, вы можете поместить все связанные со структурой страницы вещи, такие как боковые панели, пользовательские заголовки, баннеры и т. Д., В одну и ту же область видимости страницы.
===== ОБНОВЛЕНИЕ =====
Поскольку ваши AJAX-вызовы кажутся относительно статичными, я бы посоветовал вашим путям использовать какое-то прямое соответствие.
Если мое предположениеправильно, у вашей верхней навигации есть несколько пунктов, и у каждого элемента есть свое подменю.Таким образом, вы хотите загрузить подменю по одному, но не все.(Если на самом деле это все, то вы можете просто включить их все в рендеринг ...)
/page_structures/:top_nav/:sub_nav_template_name # So in here I assumed you will have many navigations and sub-nav to load.
, тогда мы сопоставим этот путь со следующим действием:
def get_sub_nav
# checks both params[:top_nav] and params[:sub_nav_template_name] exist and not pointing to some other dangerous place. (I don't know if this work if the input is './' or '../' these kind of things
render "page_structures/navigation/#{params[:top_nav]}/#{params[:sub_nav_template_name]}"
end
Таким простымдействие, когда бы вы ни добавляли больше элементов навигации / навигации, вам просто нужно создать соответствующий шаблон ответа AJAX.таким образом, вы делаете минимальные вещи!
Конечно, если кому-то, как у вас есть какие-то элементы, нужно будет возвращать некоторые другие данные в качестве ответа, такие как отвечающие подкатегории, вам может потребоваться создатьдругие маршруты, чтобы вы могли передать свой родительский идентификатор категории.
Вы можете подумать так: мое предложение относится к относительно статической централизованной суб-навигации по умолчанию. Но если вам нужны специализированные суб-навигации, для обработки которых требуются другие данные, для каждой из них вам нужно создатьмаршрут и действие в контроллере навигации для принятия идентификатора вашей категории, идентификатора продукта и т. д. Но, тем не менее, этот файл шаблона может следовать тем же способом подачи.