2009-05-27 2 views
5

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

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

ответ

8

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

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

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

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

Update: На протяжении вашего приложения вы можете решить только использовать эту информацию, когда пользователь регистрируется в Вы можете определить 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 если вы передумаете и хотите, чтобы анонимные профили имели эффект для ваших анонимных пользователей.

+0

Спасибо, это звучит хорошо. Но как насчет того, чтобы на самом деле не применять активность на сайте до регистрации пользователя? Извините, если это глупый вопрос, но это не было очевидно для меня из вашего ответа. –

2

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

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

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

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

Поскольку это рельсы вопрос ...

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

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

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

+0

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

+0

Чтобы быть спасенным, я имею в виду, чтобы на самом деле повлиять на веб-сайт. Например, голосование не засчитывается или комментарий фактически не появляется до тех пор, пока пользователь не зарегистрируется. –

Смежные вопросы