gpt4 book ai didi

ruby-on-rails - 允许匿名/访客用户使用 "try out"功能而无需在 Rails/Devise/CanCan 应用程序中注册

转载 作者:行者123 更新时间:2023-12-04 18:14:58 25 4
gpt4 key购买 nike

我正在使用 Devise 和 CanCan 开发 Rails 3 应用程序。
该应用程序允许匿名(未注册)用户访问应用程序的某些部分,而注册用户则可以访问其他部分。
该应用程序( Yaga 锻炼应用程序)的一个方面是用户可以通过将 Yaga 姿势串在一起来创建 Yaga 序列,然后他们可以在视频播放器中播放它们。
我目前拥有注册用户的所有功能,但现在希望允许匿名用户能够创建序列并播放它,但要“保存”它(即能够在任何后续 session 中再次使用它) ,他们需要注册。
目前,这需要实际创建一个属于 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 模型。
我在 Sequences DO 属于用户的地方做了一些修改,但它不是强制性的(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) 都可以编辑任何其他匿名用户的序列。我想这不是世界末日,但是,我希望它更安全。
以下是我想到的潜在方法:
“注册”匿名用户
  • 如果 guest 用户要创建序列,请生成电子邮件和密码并“注册”此“ guest ”用户。然后将新的序列模型分配给这个新用户。如果用户决定真正注册,只需使用新的电子邮件和密码更新现有的用户记录。
  • 优点:对现有应用程序的更改很少 - 只需在“注册”过程中处理它。
  • 缺点:可能最终会有很多死用户帐户,我需要在
  • 之后清理这些帐户。

    不要持久化序列,而是将其序列化并将其存储在 session 中
  • 如果 guest 用户要制作一个序列,当他们想要“保存”它时,请将其发送到序列化模型并将其存储在 session 中的 Controller 方法。然后,序列播放器,我猜,序列编辑器可以选择从 session 而不是数据存储中提取它
  • 优点:无需为 guest 创建用户帐户,因此无需清理。无需处理修改能力,因为 guest 不会从数据存储区获取模型,而是从他们的 session 中获取模型。
  • 缺点:看起来很笨拙。将需要应用程序中的大量接触点来确定从何处获取序列。更高的错误可能性

  • 找出将序列分配给 guest 用户的其他方法,然后将 user_id 设为 nil
  • 优点:会很精彩
  • 缺点:不知道该怎么做。

  • 我希望有一些我在 Devise 中没有看到的东西(也许是邀请的?),这样会更干净,然后自己动手。
    或者,有人对这个问题有什么建议吗?这似乎是一个相对常见的要求,但无法找到任何指导。
    谢谢!

    最佳答案

    在 Ryan 对 CanCan 的介绍中,他提供了以下建议:

    在内存中为站点上的访客用户创建一个新用户对象,但不要保存它。这样,您需要与用户关联的所有功能仍然可以使用,但不会保存。

    在此处查看 railscast:http://railscasts.com/episodes/192-authorization-with-cancan

    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

    因此,在您的应用程序中,如果您使用了这种方法,那么在您的 View 中,您可以检查 current_user.new_record? ,并为注册用户和访客呈现不同的“保存”按钮。

    您可以通过在序列创建页面上提供隐藏的帐户注册表单来使这变得非常简单(避免将其存储在 session 中等)。然后只需让您的访客“保存”按钮显示帐户创建表单,当他们提交该表单时,他们将同时提交用户注册和序列创建。

    然后你所有的 Sequences#create Action 需要做的是:
    ...
    current_user.update_attributes(params[:user]) if current_user.new_record?

    if current_user.sequences.create(params[:sequence])
    redirect_to ...
    else
    render ...
    end
    ...

    你需要把它变成工作代码,但我相信基本的想法会奏效。

    祝你好运!

    关于ruby-on-rails - 允许匿名/访客用户使用 "try out"功能而无需在 Rails/Devise/CanCan 应用程序中注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384442/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com