Если у всех ваших пользователей есть поля профиля и учетной записи, я бы не стал указывать это в отдельных моделях. Это только добавит ненужную сложность вашим формам, а добавление может добавить некоторые sql запросы.
Я не вижу здесь никаких проблем с безопасностью. В случае редактирования оба действия (редактирование аккаунта и профиля) должны быть защищены одинаково - так что только владелец-пользователь должен иметь возможность редактировать их оба. Если он хочет «взломать» его и отредактировать также свой логин, когда редактирует свое имя, тогда это его проблема. Это не вызовет никаких проблем, так как ему разрешено редактировать оба поля.
В соответствии с представлениями, которые доступны для просмотра другим пользователям: просто не отображайте там никаких полей, принадлежащих части учетной записи.
Как это отделить? Для меня самый чистый способ - добавить такие маршруты:
map.resources :accounts
map.resources :profiles
И используйте пути типа /accounts/34/edit
для редактирования части учетной записи и /profiles/34/edit
для редактирования части профиля.
В этом случае вам понадобится отдельный контроллер для обоих маршрутов: accounts_controller.rb
и profiles_controller.rb
. Если у них много похожих методов и поведения, вы можете добавить его в users_controller.rb
, а также в профили и контроллеры учетных записей, наследующие его.
Вы также можете сделать это с одним контроллером:
map.resources :accounts, :controller => 'users'
map.resources :profiles, :controller => 'users'
Но я не знаю, как передать какое-то дополнительное значение для маршрутов, созданных с помощью resources
. Когда вы используете connect
, вы можете передать его с :defaults => {:foo => 'bar'}
, и тогда он будет доступен в контроллере как params[:foo]
, но, похоже, он не будет работать с resources
. Так как же отличить аккаунты от профилей? Вы можете прочитать его по текущему URL ( вот пример ). И тогда в контроллере вы можете визуализировать различные представления в соответствии с запрашиваемым ресурсом.