Создание каталога администратора в рельсах
-
23-10-2019 - |
Вопрос
Я разрабатываю бэкэнд CMS для веб -сайта уже несколько недель. Идея состоит в том, чтобы сначала создать все в бэкэнде, чтобы она могла управлять базой данных и информацией, которая будет отображаться на основном веб -сайте.
На данный момент у меня в настоящее время есть все настройки кода в обычной структуре MVC MVC. Таким образом, администратор пользователей является /пользователями, а видео - /видео.
Мои планы состоит в том, чтобы взять код для этого и переместить его в каталог A /Admin. Таким образом, два контроллера, выше, необходимо получить доступ к /admin /users и /Admin /Videos. Я не уверен, как ToDo Ruote (добавление /администратор в качестве префикса) и я уверен в том, как управлять логикой. Я думаю, что настройка дополнительного «среднего» контроллера, который каким -то образом вкладывается между ApplicationControler и целевым контроллером при обращении /Admin Directory. Таким образом, любые дополнительные флаги и перегруженные методы могут быть порождены только для раздела /администратора (я полагаю, что я тоже мог бы использовать фильтр).
Если бы это было сработать, то следующим вопросом будет разделение логики представлений (но это просто переименование папок и так далее).
Либо я делаю это таким образом, либо у меня есть два экземпляра рельса, которые разделяют код MVC между ними (и я думаю, что база данных тоже), но я боюсь, что это вызвало бы много ошибок дублирования.
Есть идеи относительно того, как мне это делать?
Большое спасибо!
Решение
Если вы не против иметь два контроллера для каждого ресурса, у вас может быть отдельное пространство имен «администратора». Мне это нравится, так как раздел администратора полностью отличается от публичной. Административные контроллеры реализуют все действия CRUD, тогда как публичные реализуют только действия и индекс.
routes.rb:
map.namespace :admin do |admin|
admin.resources :users
admin.resources :videos
end
map.resources :videos, :only => [:index, :show]
Ваши контроллеры могут быть чем -то вроде:
class VideosController < PublicController; end
class Admin::VideosController < Admin::AdminController; end
class PublicController < ApplicationController
layout 'public'
before_filter :load_public_menu
end
class Admin::AdminController < ApplicationController
layout 'admin'
before_filter :login_required, :load_admin_menu
end
Контроллеры и представления с именами имеют свой собственный подкаталог внутри приложения/контроллеров и каталогов приложений/представлений. Если вы используете form_for
Помощник, вам нужно изменить его параметры:
form_for [:admin, @video] do |f|
Другие советы
Вы можете сделать это без дополнительного контроллера, относительно легко в config/routes.rb
:
# non-admin routes
# your args could include :only => [:index,:show] for the non-admin routes
# if you wanted these to be read-only
map.resources :users, ...your args..., :requirements => { :is_admin => false }
map.resources :videos, ...your args..., :requirements => { :is_admin => false }
# admin routes
map.resources :users, ...your args..., :path_prefix => '/admin', \
:name_prefix => 'admin_', :requirements => { :is_admin => true }
map.resources :videos, ...your args..., :path_prefix => '/admin', \
:name_prefix => 'admin_', :requirements => { :is_admin => true }
какая :requirements
на самом деле здесь делает, потому что я дал ему постоянную, а не регулярность, просто добавить params[:is_admin]
При обращении к этому маршруту. Таким образом, вы можете проверить это значение в своем контроллере и отображать разные представления, или вы можете просто проверить его в представлении, если два представления похожи. Важно включить требование с false
В версиях, не являющихся админами, иначе люди могут просто использовать /users/?is_admin=true
.
А :name_prefix
Редактирует названия маршрутов, так что у вас есть, например, admin_video_path(123)
так же как video_path(123)
.
Протестировано на рельсах 2.3.5, другие версии могут отличаться. Для получения дополнительной информации о параметрах, доступных на спокойных маршрутах, см. ActionController :: Resources Docs.