Как можно реализовать этот вид постепенного участия / ленивой регистрации в Rails? - PullRequest
5 голосов
/ 28 мая 2009

Давным-давно я столкнулся с сайтом (я, к сожалению, потерял адрес, это был какой-то газетный сайт), который позволял вам использовать все, как если бы вы были зарегистрированным пользователем. Вы можете оценивать, добавлять в избранное и комментировать статьи, и когда вы это сделаете, будет отображаться скрытое встроенное сообщение о том, что вы должны зарегистрироваться на веб-сайте, чтобы сохранить ваши вклады. Тогда у него была ссылка для вас, чтобы посмотреть, как выглядел бы ваш профиль, если бы вы это делали, и я был удивлен, увидев там всю мою активность; статьи, которые я прочитал и сохранил, комментарии и т. д. Я покинул сайт, и когда я вернулся к нему позже просто из любопытства, он все равно сохранил мою активность.

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

Ответы [ 2 ]

8 голосов
/ 28 мая 2009

Я бы создал модель Profile, которая автоматически создается для любого пользователя, который посещает ваш сайт и добавляет первого фаворита, оценивает первый элемент и т. Д. Profile должен быть сохранен в вашей базе данных, включая подходящую случайную и уникальная строка. Эта строка может быть сохранена в виде файла cookie на стороне клиента и будет использована позже для получения вашего профиля. Он должен быть случайным и достаточно длинным, чтобы вы не могли легко подделать свой файл cookie и получить профили других анонимных людей, но этого нельзя полностью избежать (так что будьте осторожны, вы не храните конфиденциальные данные в анонимных профилях!).

После регистрации пользователя вы можете связать его Profile с его новой записью User и удалить cookie и уникальный строковый идентификатор. Теперь вы можете просто получить их профили при входе в систему на основе их записи User.

Модель Profile может содержать любую информацию, которую вы хотите сохранить.

Если вы хотите провести различие между зарегистрированными и анонимными пользователями, вы можете создать модель AnonymousProfile и модель Profile (каждая с различными атрибутами) и просто скопировать все данные из анонимного профиля в профиль пользователя. когда кто-то регистрируется.

Обновление: Во всем приложении вы можете решить использовать эту информацию только тогда, когда пользователь вошел в систему. Вы можете определить before_filter, который захватывает текущего пользователя, и только при наличии фактического пользователя, вошедшего в систему, вы используете данные профиля:

class ApplicationController < ActionController::Base
  before_filter :fetch_user_data

  def fetch_user_data
    @current_user = ... # Work your magic to get current user
  end

  private

  def current_profile
    @current_user and @current_user.profile  # Use profile association
  end
end

Где-то в действии контроллера:

if current_profile
  # Do stuff with current_profile
  # Only available to registered users...
end

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

2 голосов
/ 28 мая 2009

Единственный способ идентифицировать пользователей - это использовать куки. Что сайт, который вы использовали, вероятно, делает:

Пользователь впервые создает запись в таблице «пользователи» и добавляет их в группу «Гости». Сохраните файл cookie идентификатора на компьютере пользователя, чтобы вы могли просмотреть его позже.

Если пользователь решит зарегистрироваться, вы можете заполнить оставшиеся его данные в пользовательской таблице (вы можете даже захотеть иметь отдельную таблицу для пользовательских данных и регистрационных данных, таких как имя пользователя / пароль и т. Д.) И добавить их. в группу зарегистрированных пользователей.

Способ управления группами может быть простым, как флаг в базе данных.

Как это вопрос рельсов ...

Я бы, вероятно, обработал большую часть этого в before_filter в вашем application_controller.rb. Шаги будут примерно такими:

if has_cookie
   @user = lookup_user
else
   @user = create_new_guest_user
end

Вы можете очень легко расширить одну из существующих платформ аутентификации, например Act_as_authenticated или разрешение, чтобы сделать это.

...