Я занимаюсь разработкой приложения на Rails 3 с использованием Devise и CanCan.
Приложение позволяет анонимным (не зарегистрированным) пользователям получать доступ к некоторым приложениям, а зарегистрированным пользователям - другие части.
Один из аспектов приложения (приложение для тренировки йоги) состоит в том, что пользователи могут создавать последовательности йоги, связывая воедино позы йоги, а затем воспроизводить их в видеоплеере.
В настоящее время у меня есть все функции длязарегистрированные пользователи, но теперь они хотят, чтобы анонимные пользователи могли создавать последовательность и воспроизводить ее, но для того, чтобы «сохранить» ее (т. е. снова использовать в любой последующей сессии), им необходимо зарегистрироваться.
В настоящее время для этого требуется фактическое создание экземпляра модели Sequence, который принадлежит пользователю (упрощенно ниже)
class Sequence < ActiveRecord::Base
validates_presence_of :name
validate :status_must_be_private_if_user_nil
# Associations
has_many :ordered_asana_sequences, :class_name => "OrderedAsanaSequence", :order => 'position ASC', :dependent => :destroy
has_many :asanas, :through => :ordered_asana_sequences
belongs_to :user
def status_must_be_private_if_user_nil
errors.add(:status, "must be private is user is nil") if
user == nil and status != :private
end
end
Но, конечно, у анонимных пользователей нет модели User.
Я что-то взломал, когда Последовательности ДОЛЖНЫ принадлежать Пользователям, но это не обязательно (user_id может быть nil, как вы можете видеть выше), и возможностьредактирование защищено через CanCan:
class Ability
{snip}
# A guest can play with creating sequences
can :create, [Sequence]
# A guest can edit/update their own Sequences
can :update, [Sequence], :user_id => user.id
end
Но это означает, что любой анонимный пользователь (user_id = nil) может редактировать любые последовательности других анонимных пользователей.Который, я думаю, не конец света, но я бы предпочел, чтобы он был более безопасным.
Вот потенциальные способы, которыми я думал сделать это:
'Зарегистрируйте «анонимных пользователей»
- Если гостевой пользователь собирается создать последовательность, сгенерируйте адрес электронной почты и пароль и «зарегистрируйте» этого «гостевого» пользователя.Затем назначьте новую модель последовательности этому новому пользователю.Если пользователь решает зарегистрироваться в режиме реального времени, просто обновите существующую запись пользователя новым адресом электронной почты и паролем.
- Преимущества: Очень мало изменений в существующем приложении - нужно только разобраться с ним впроцесс "регистрации".
- Недостатки: может привести к большому количеству мертвых учетных записей пользователей, которые мне нужно смести после
Не сохраняйтеУпорядочить, но сериализовать и сохранить в сеансе
- Если пользователь-гость собирается создать последовательность, когда он хочет ее «сохранить», снимите ее в метод контроллера, который сериализует модель исохраняет его в сеансе.Затем проигрыватель Sequence и, я полагаю, редактор последовательностей могут при желании извлечь его из сеанса вместо хранилища данных
- Преимущества: Нет необходимости создавать учетные записи для гостей, поэтому нет необходимостиочистки.Не нужно заниматься модификацией Способностей, так как гость будет получать модели не из хранилища данных, а из их сеанса.
- Недостатки: Кажется хакерским.Потребуется много точек соприкосновения в приложении, чтобы определить, откуда взять последовательность.Более высокий потенциал для ошибок
Придумайте другой способ назначить Последовательность гостевому пользователю, кроме создания user_id nil
- Преимущества: Это будет блестяще
- Недостатки: Понятия не имею, что делать.
Я надеюсь, что есть кое-что, чего я не видел в Devise (можно пригласить,может быть?) это было бы чище, чем самому кататься.
Или у кого-нибудь есть предложения по этой проблеме?Это кажется довольно распространенным требованием, но не смог найти каких-либо указаний.
Спасибо!