Создание админ-каталога в Rails - PullRequest
7 голосов
/ 03 июня 2010

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

На данный момент у меня есть все настройки моего кода в обычной структуре MVC рельсов. Таким образом, пользователи admin / пользователи и видео /videos.

Я планирую взять код для этого и переместить его в каталог / admin. Таким образом, два вышеуказанных контроллера должны быть доступны для / admin / users и / admin / videos. Я не уверен, как сделать руто (добавив / admin в качестве префикса), и я не уверен, как управлять логикой. Я думаю о том, чтобы установить дополнительный «средний» контроллер, который каким-то образом вкладывается между ApplicationControler и целевым контроллером при доступе к каталогу / admin. Таким образом, любые дополнительные флаги и перегруженные методы могут порождаться только для раздела / admin (я думаю, что я мог бы также использовать фильтр для этого).

Если бы это сработало, то следующей проблемой было бы разделение логики представлений (но это просто переименование папок и т. Д.).

Либо я делаю это таким образом, либо у меня есть два экземпляра rails, которые разделяют код MVC между ними (и я предполагаю, что база данных тоже), но я боюсь, что это вызовет множество ошибок дублирования.

Есть идеи, как мне поступить?

Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 03 июня 2010

Если вы не против иметь два контроллера для каждого ресурса, у вас может быть отдельное пространство имен «admin». Мне это нравится, так как раздел администратора полностью отличается от публичного. Контроллеры администратора реализуют все действия CRUD, тогда как публичные контроллеры реализуют только действия show и index.

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

Контроллеры и представления пространства имен имеют свои собственные подкаталоги внутри каталогов app / controllers и app / views. Если вы используете помощник form_for, вам нужно изменить его параметры:

form_for [:admin, @video] do |f|
1 голос
/ 03 июня 2010

Вы можете сделать это без дополнительного контроллера, относительно легко в 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).

Протестировано на Rails 2.3.5, другие версии могут отличаться. Дополнительные сведения о параметрах, доступных на маршрутах RESTful, см. В документации по ActionController :: Resources .

.
...