Rails Routes / Контроллер / Директория Структура вопрос - PullRequest
1 голос
/ 28 мая 2011

У меня вопрос по дизайну, и я был бы признателен за вдумчивый ответ.

Допустим, у вас есть простое приложение (например, ради), которое имеет модель User, Company и Theme. Компания has_one Тема и has_many Пользователи.

Администраторы (пользователь) могут полностью управлять компаниями, пользователями и темами - всем стеком REST, в дополнение к нескольким другим действиям. Предполагается, что администраторы будут делать то же самое со всеми этими тремя ресурсами, чего не могут делать другие роли пользователей.

У нас также есть роль компании. Эта роль может редактировать собственную компанию, а также выбирать тему из тех, которые администратор добавил в качестве хороших значений по умолчанию, или они могут просто создать свою собственную тему.

Компании также могут добавлять / редактировать / удалять пользователей, но только для своей компании. Эти страницы будут иметь разные представления и поведение администраторов будет отличаться - некоторые будут совпадать, но некоторые будут ограничены, а другие будут добавлены.

Теперь у нас есть несколько нетривиальных вариантов дизайна, и я хотел бы знать, какова лучшая практика.

ЧАСТЬ 1

В Rails имеет смысл иметь resources :users, :companies, :themes для администраторов и, вероятно, resource :company, :theme, :users для пользователей компании.

Но, конечно, здесь мы сталкиваемся с некоторыми конфликтами имен - как в единственном, так и во множественном числе - поэтому мы можем попробовать что-то вроде resource :my_company, :my_theme, :my_users, чтобы разделить их? Или есть лучшее решение?

Кроме того, тема - это просто компонент компании, поэтому, может быть, мы хотим их вложить?

:resource :my_company do
  :resource :theme
  :resources :users
end

Это работает нормально, но это может сбить с толку вопрос о том, на какой UsersController мы ссылаемся ... нет? Это действительно липко, и я хотел бы знать, как справиться с этим. У вас есть 1 контроллер или 2? Как вы их называете?

Так что это будет пример:

http://myapp.com/my_company/theme/edit
http://myapp.com/my_company/users/1/delete

Пользователям компании также может потребоваться список тем через ajax, поэтому для них будет правильным позвонить:

http://myapp.com/themes.json

Это как подойти к этой ситуации или есть лучший способ?

ЧАСТЬ 2

Кроме того, как должна выглядеть ваша структура каталогов? Должны ли у вас контроллеры разделяться ролями пользователей?

/app/controllers/admin/companies_controller.rb
/app/controllers/admin/themes_controller.rb
/app/controllers/admin/users_controller.rb
/app/controllers/company/my_company_controller.rb
/app/controllers/company/theme_controller.rb
/app/controllers/company/users_controller.rb

Или есть лучшие способы справиться с этим?

Кажется странным, что users_controller дублируется в 2 раза и между темой и темой есть небольшая разница.

Я был бы очень признателен за вдумчивый ответ на этот вопрос. Спасибо!

1 Ответ

1 голос
/ 28 мая 2011

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

  • Ресурс живет в одном месте. User.find(1) должен иметь один локатор (URL), который мне нравится называть user_path. Мне нравится называть его user_path из-за того, что я сам заставляю его называть admin_company_user_path ([@ company, @user]), что вызывает недомогание каждый раз, когда я пишу.
  • Этот ресурс может отображаться по-разному для разных ситуаций, например, если запрашивающий объект был XHR или указал, что он предпочел бы немецкий язык английскому. Почему в заголовке указано, что пользователь является администратором?
  • Если я смогу сделать так, чтобы это выглядело как самые простые примеры в rails / README, не так ли?

На данный момент я бы уступил и в конечном итоге:

/app/controllers/companies_controller.rb
/app/controllers/users_controller.rb
/app/controllers/themes_controller.rb

И мой route.rb будет иметь:

resources :users
resources :companies
resources :themes

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

= form.input :title if user_can_change_title?
= form.input :theme if user_can_change_theme?

А остальные различия будут обрабатываться в CSS, возможно, с таблицей стилей для каждой роли.

В менее идеальном сценарии я мог бы использовать:

= render :partial => "#{current_user.role}_form"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...