Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 允许匿名/来宾用户;试用;无需在Rails/Desive/CanCan应用程序中注册的功能_Ruby On Rails_Devise_Cancan - Fatal编程技术网

Ruby on rails 允许匿名/来宾用户;试用;无需在Rails/Desive/CanCan应用程序中注册的功能

Ruby on rails 允许匿名/来宾用户;试用;无需在Rails/Desive/CanCan应用程序中注册的功能,ruby-on-rails,devise,cancan,Ruby On Rails,Devise,Cancan,我正在使用Desive和CanCan开发Rails 3应用程序 该应用程序允许匿名(未注册)用户访问部分应用程序,并允许注册用户访问其他部分 该应用程序(瑜伽锻炼应用程序)的一个方面是,用户可以通过将瑜伽姿势串在一起创建瑜伽序列,然后在视频播放器中播放 我目前拥有注册用户的所有功能,但现在想让匿名用户能够创建一个序列,并播放它,但要“保存”它(即,能够在任何后续会话中再次使用它),他们需要注册 目前,这需要实际创建一个序列模型实例,它属于一个用户(简化如下) 但是,这意味着任何匿名用户(user

我正在使用Desive和CanCan开发Rails 3应用程序

该应用程序允许匿名(未注册)用户访问部分应用程序,并允许注册用户访问其他部分

该应用程序(瑜伽锻炼应用程序)的一个方面是,用户可以通过将瑜伽姿势串在一起创建瑜伽序列,然后在视频播放器中播放

我目前拥有注册用户的所有功能,但现在想让匿名用户能够创建一个序列,并播放它,但要“保存”它(即,能够在任何后续会话中再次使用它),他们需要注册

目前,这需要实际创建一个序列模型实例,它属于一个用户(简化如下)

但是,这意味着任何匿名用户(user_id=nil)都可以编辑任何其他匿名用户的序列。我想这并不是世界末日,但我更希望它更安全

以下是我想到的可能的方法: “注册”匿名用户
  • 如果一个访客用户去做一个序列,生成一封电子邮件和密码,并“注册”这个“访客”用户。然后将新的序列模型分配给这个新用户。如果用户决定注册real,只需使用新的电子邮件和密码更新现有用户记录
  • 优点:对现有应用的更改很少-只需在“注册”过程中处理即可
  • 缺点:可能会导致大量死机用户帐户,我需要清理这些帐户
不要持久化序列,而是序列化它并将其存储在会话中
  • 如果来宾用户要创建一个序列,当他们想要“保存”它时,将其发送到一个控制器方法,该方法序列化模型并将其存储在会话中。然后,序列播放器,我猜,序列编辑器可以选择从会话而不是数据存储中提取它
  • 优点:无需为来宾创建用户帐户,因此无需清理。不需要处理修改功能,因为来宾不会从数据存储中获取模型,而是从它们的会话中获取模型
  • 缺点:似乎很老套。在应用程序中需要很多接触点来确定从何处获取序列。更高的潜在缺陷
找出一些其他的方法来为来宾用户分配一个序列,然后将用户的id设为nil
  • 优势:一定会很精彩
  • 缺点:不知道该怎么办
我希望在Desive中有一些我从未见过的东西(也许是可邀请的?)比我自己做的更干净

或者,有人对这个问题有什么建议吗?这似乎是一个相对普遍的要求,但无法找到任何指导


谢谢

在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