我正在使用 Devise 和 CanCan 开发 Rails 3 应用程序。
该应用程序允许匿名(未注册)用户访问该应用程序的某些部分,并允许注册用户访问其他部分。
该应用程序(瑜伽锻炼应用程序)的一个方面是,用户可以通过将瑜伽姿势串在一起来创建瑜伽序列,然后可以在视频播放器中播放它们。
我目前拥有注册用户的所有功能,但现在希望允许匿名用户能够创建序列并播放它,但要“保存”它(即能够在任何后续会话中再次使用它) ,他们需要注册。
目前,这需要实际创建一个属于 User 的 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_id 可以为零,如您在上面看到的),并且通过 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) 都可以编辑任何其他匿名用户的序列。我想这不是世界末日,但是,我希望它更安全。
以下是我想到的潜在方法:
“注册”匿名用户
- 如果访客用户要进行序列,请生成电子邮件和密码并“注册”该“访客”用户。然后将新的序列模型分配给该新用户。如果用户决定真实注册,只需使用新的电子邮件和密码更新现有的用户记录即可。
-
优点:对现有应用程序的更改很少 - 只需要在“注册”过程中处理它。
-
缺点:可能最终会产生大量失效的用户帐户,我需要在之后清理它们
不要持久化序列,而是将其序列化并将其存储在会话中
- 如果访客用户要创建序列,当他们想要“保存”它时,将其发送到控制器方法,该方法序列化模型并将其存储在会话中。然后,序列播放器和序列编辑器可以选择从会话而不是数据存储中提取它
-
优点:无需为访客创建用户帐户,因此无需清理。无需处理修改能力,因为来宾不会从数据存储中获取模型,而是从其会话中获取模型。
-
缺点:看起来很老套。应用程序中需要大量接触点来确定从哪里获取序列。出现错误的可能性更高
找出其他方法将序列分配给来宾用户,然后将 user_id 设置为 nil
我希望有一些我在 Devise 中没有见过的东西(也许是可邀请的?),它们会比我自己滚动它更干净。
或者,有人对这个问题有什么建议吗?这似乎是一个相对常见的要求,但无法找到任何指导。
Thanks!