2010-02-23 2 views
2

У меня есть модель пользователя с обычной информацией (логин, адрес электронной почты, имя, местоположение и т. Д.). Однако, когда пользователи решают изменить свою информацию, я хотел бы отделить поля для редактирования в соответствии с соответствующими проблемами.Rails: Как обрабатывать некоторые поля информации о модели самостоятельно? Например. Учетная запись против профильной информации

Например, я хотел бы иметь Name, Bio и Location быть отредактированы на Profile странице или вкладке, и login, email и password быть отредактированы на Account странице или вкладке.

Каковы наилучшие методы и самый безопасный способ для этого? Должен ли я иметь две отдельные модели/ресурсы: User и UserProfile? Или я могу просто создать что-то вроде метода profile в UserController с пользовательской формой с только полями профиля и ссылкой на него на странице пользователя? Я действительно смущен тем, как это сделать.

Заранее благодарим за любые идеи, которые могут возникнуть у вас.

ответ

3

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

Модель:

class User < ActiveRecord::Base 
    has_one :profile, :dependent => :destroy 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 
+0

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

1

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

Это говорит о том, что в определенный момент в моих системах я стараюсь вытащить информацию профиля из базового класса User, поэтому пользователь становится исключительно для аутентификации.

3

Если все пользователи имеют как профиль и счета поля, то я бы не поставить его в отдельно моделях. Это добавит ненужные сложности в ваши формы и добавит может добавить некоторые 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-адреса (here is example). А затем в контроллере вы можете отображать разные виды в соответствии с запрошенным ресурсом.

+0

Я не эксперт Rails, но я не понимаю, почему он может добавить некоторые sql-запросы. Если есть некоторые представления, которые отображают только информацию о профиле, не могут ли они потенциально сократить запросы? – ghoppe

+0

@ghoppe: когда у него есть одна модель, то наверняка она будет запрашиваться только один раз. Когда он имеет две таблицы и он загружает '@user = User.find (params [: id])', а затем он использует '@ user.profile.login', тогда он сделает второй запрос. Я не эксперт sql, но думаю, что лучше иметь одну таблицу с большим количеством столбцов, чем две таблицы с меньшим количеством столбцов, если мы обязательно будем использовать их и присоединим их. – klew

+0

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