Ruby on rails 允许匿名/来宾用户;试用;无需在Rails/Desive/CanCan应用程序中注册的功能
我正在使用Desive和CanCan开发Rails 3应用程序 该应用程序允许匿名(未注册)用户访问部分应用程序,并允许注册用户访问其他部分 该应用程序(瑜伽锻炼应用程序)的一个方面是,用户可以通过将瑜伽姿势串在一起创建瑜伽序列,然后在视频播放器中播放 我目前拥有注册用户的所有功能,但现在想让匿名用户能够创建一个序列,并播放它,但要“保存”它(即,能够在任何后续会话中再次使用它),他们需要注册 目前,这需要实际创建一个序列模型实例,它属于一个用户(简化如下) 但是,这意味着任何匿名用户(user_id=nil)都可以编辑任何其他匿名用户的序列。我想这并不是世界末日,但我更希望它更安全 以下是我想到的可能的方法: “注册”匿名用户Ruby on rails 允许匿名/来宾用户;试用;无需在Rails/Desive/CanCan应用程序中注册的功能,ruby-on-rails,devise,cancan,Ruby On Rails,Devise,Cancan,我正在使用Desive和CanCan开发Rails 3应用程序 该应用程序允许匿名(未注册)用户访问部分应用程序,并允许注册用户访问其他部分 该应用程序(瑜伽锻炼应用程序)的一个方面是,用户可以通过将瑜伽姿势串在一起创建瑜伽序列,然后在视频播放器中播放 我目前拥有注册用户的所有功能,但现在想让匿名用户能够创建一个序列,并播放它,但要“保存”它(即,能够在任何后续会话中再次使用它),他们需要注册 目前,这需要实际创建一个序列模型实例,它属于一个用户(简化如下) 但是,这意味着任何匿名用户(user
- 如果一个访客用户去做一个序列,生成一封电子邮件和密码,并“注册”这个“访客”用户。然后将新的序列模型分配给这个新用户。如果用户决定注册real,只需使用新的电子邮件和密码更新现有用户记录
- 优点:对现有应用的更改很少-只需在“注册”过程中处理即可
- 缺点:可能会导致大量死机用户帐户,我需要清理这些帐户
- 如果来宾用户要创建一个序列,当他们想要“保存”它时,将其发送到一个控制器方法,该方法序列化模型并将其存储在会话中。然后,序列播放器,我猜,序列编辑器可以选择从会话而不是数据存储中提取它
- 优点:无需为来宾创建用户帐户,因此无需清理。不需要处理修改功能,因为来宾不会从数据存储中获取模型,而是从它们的会话中获取模型
- 缺点:似乎很老套。在应用程序中需要很多接触点来确定从何处获取序列。更高的潜在缺陷
- 优势:一定会很精彩
- 缺点:不知道该怎么办
谢谢 在Ryan对CanCan的介绍中,他提出了以下建议: 在内存中为站点上的来宾用户创建一个新的用户对象,但不要保存它。这样,所有需要与用户关联的函数仍然可以工作,但不会保存 请参见此处的railscast: Ryan的代码示例是:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # This initializer is creating your memory-only guest users
if user.role? :admin
can :manage, :all
else
can :read, :all
can :create, Comment
can :update, Comment do |comment|
comment.try(:user) == user || user.role?(:moderator)
end
if user.role?(:author)
can :create, Article
can :update, Article do |article|
article.try(:user) == user
end
end
end
end
end
因此,如果您在应用程序中使用这种方法,那么在您的视图中,您可以检查当前\u用户。新建\u记录?
,并为注册用户和来宾呈现不同的“保存”按钮
通过在序列创建页面上提供一个隐藏的帐户注册表单,您可以使这变得非常简单(避免将其存储在会话中等)。然后,只需让你的“保存”按钮为客人显示帐户创建表单,当他们提交表单时,他们同时提交用户注册和序列创建
然后,您需要执行的所有序列#创建操作如下所示:
...
current_user.update_attributes(params[:user]) if current_user.new_record?
if current_user.sequences.create(params[:sequence])
redirect_to ...
else
render ...
end
...
您需要将其转换为工作代码,但我相信基本思想会起作用
祝你好运 我还在从事rails 3项目,包括Desive和cancan。我的需求有点不同,因为我需要在数据库中持久化匿名用户的活动(不需要扫描)。以下是我为匿名用户登录所做的操作。希望这有帮助
def sign_in_anonymous_user
unless user_signed_in?
user = User.new
role = "anonymous"
user.confirmed_at = Time.now-1.minute
user.save :validate => false
sign_in :user, user
end
end
没有被咬,是吗?这个问题只是一团糟吗?太抽象了?毫无意义?有任何关于清理问题的建议吗?对给定的答案没有任何评论或问题?正在度假!我会复习你的答案。
...
current_user.update_attributes(params[:user]) if current_user.new_record?
if current_user.sequences.create(params[:sequence])
redirect_to ...
else
render ...
end
...
def sign_in_anonymous_user
unless user_signed_in?
user = User.new
role = "anonymous"
user.confirmed_at = Time.now-1.minute
user.save :validate => false
sign_in :user, user
end
end