允许匿名/来宾用户“尝试”功能,而无需在 Rails/Devise/CanCan 应用程序中注册

2024-03-05

我正在使用 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!


Ryan 在对 CanCan 的介绍中提出了以下建议:

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

请参阅此处的轨道广播:http://railscasts.com/episodes/192-authorization-with-cancan 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

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

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

那么你所有的 Sequences#create 操作需要做的就是:

...
current_user.update_attributes(params[:user]) if current_user.new_record?

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

您需要将其转化为工作代码,但我相信基本想法是可行的。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

允许匿名/来宾用户“尝试”功能,而无需在 Rails/Devise/CanCan 应用程序中注册 的相关文章

  • Rails 模型中的多个 counter_cache

    我正在学习 Rails 遇到了一个小问题 我正在编写带有任务列表的非常简单的应用程序 因此模型看起来像这样 class List lt ActiveRecord Base has many tasks has many undone tas
  • 通过 has_many 进行多个数据库连接

    如何通过使用多个数据库连接来创建 has many 我有一个名为 master 的数据库 其中保存位置信息 这是从单独的应用程序更新的 用户可以访问许多位置 但所有其他模型都位于另一个名为 budget 的数据库中 以下是模型的设置方式 p
  • Rails 建模:将 HABTM 转换为 has_many :through

    我正在现有的 Rails 站点上进行维护工作 并且遇到了一些由多对多关联引起的问题 看起来该网站最初是使用has and belongs to many对于一些业务逻辑变得更加复杂的关系 所以我需要使用has many through而是支
  • 为什么 .each 在我的 Rails 视图中完成后会重复数组? [复制]

    这个问题在这里已经有答案了 在我的 Rails 视图页面中 我有以下循环 它应该循环遍历我的 tag list 数组并打印每个标签 由于某种原因 它在打印每个单独的标签后会重复该数组 例如 这个数组有两个元素 ruby python 每个方
  • 尝试从 Rails 控制器调用辅助方法时出现 NoMethodError

    我得到了一个NoMethodError当尝试从我的控制器类之一访问我的帮助器模块之一中定义的方法时 我的 Rails 应用程序使用helper类方法与 all符号如下图所示 class ApplicationController lt Ac
  • Rails_admin 中的范围作为过滤器

    我在我的应用程序中使用rails admin 我的模型上有一些范围 以下是一个示例 class User lt ActiveRecord Base scope unconfirmed where confirmed at IS NULL e
  • ruby 中的树结构,父子采用数组格式,没有 gem?

    我有一个数组 其中包含这样的项目列表 arr id gt 1 title gt A parent id gt nil id gt 2 title gt B parent id gt nil id gt 3 title gt A1 paren
  • 在轮询器内异步运行代码

    在我的 ruby 脚本中 我使用 celluloid zmq gem 我尝试在轮询器内异步运行评估响应 使用 async evaluate response socket read multipart 但是 如果我从循环中删除睡眠 不知何故
  • 仅适用于安全页面的安全回形针 URL

    我正在尝试找到使回形针网址安全的最佳方法 但仅限于安全页面 例如 显示存储在 S3 中的图像的主页是http mydomain com http mydomain com图像网址是http s3 amazonaws com mydomain
  • AJAX Rails 验证

    我的表单和验证可以很好地处理常规的 http 请求 我希望它使用 AJAX 我知道我可以在客户端进行验证 但这似乎是多余的 因为我已经在模型中定义了验证 当用户填写表单时 我想就他们的条目向他们提供反馈 在 AJAX 表单中使用 Rails
  • Watir 脚本偶尔返回 Net::ReadTimeout 错误

    我有一个 Watir 脚本 偶尔会意外地返回此错误 Net ReadTimeout 我搜索了这个错误并发现这个问题 https stackoverflow com questions 47452276 watir get sometimes
  • Capybara 2.0 和 rspec-rails -- 助手在规范/功能中不起作用

    我正在尝试使用辅助模块中的方法 但 rspec 似乎无法识别辅助程序以进行测试spec features 请注意 唯一的更改是spec helper rb正在添加require capybara rspec 我尝试移动helper rb t
  • 红宝石和纱线

    I have an error with my RoR project when I try to start it using Run shift f10 但是当我使用启动服务器时rails s在控制台中 它有效 Your Yarn pa
  • 如何编写运行 Rails db:migrate 任务的 rake 任务?

    我想运行 db migrate VERSION 0 然后在我自己的 rake 任务中运行 db migrate 我对如何做到这一点感到困惑 我需要特殊的要求声明吗 我的 rake 任务将驻留在 Rails 应用程序的 lib tasks 目
  • mod_http_upload - 使用 Ruby on Rails 上传 HTTP 文件 (XEP-0363)

    我想在我的聊天应用程序中的用户之间传输图像 我正在使用 ejabberd 服务器进行聊天 据我发现 可以做到这一点的模块是mod http upload HTTP 文件上传 XEP 0363 我不知道如何实现这一点 任何人都可以帮助我弄清楚
  • Heroku:无法通过 Bundler 安装 gem

    我尝试使用以下命令将我的 Rails 应用程序推送到 Herokugit push heroku master f命令 我得到这个 Total 0 delta 0 reused 0 delta 0 remote Compressing so
  • Guard 不会加载 WDM

    我正在学习 Michael Hartl 的 Rails 教程 到目前为止该教程非常出色 我在高级设置一章中 他以有利于 TDD 的方式配置 Rails 环境 我安装了 Guard 并且通过运行我在 spec 文件夹中的测试 它一直正常运行
  • Rails:测试需要访问 Rails 环境的助手(例如 request.fullpath)

    我有一个可以访问的助手request fullpath 在孤立的辅助测试中 request不可用 我应该怎么办 我可以以某种方式嘲笑它或类似的东西吗 我正在使用最新版本的 Rails 和 RSpec 这是我的助手的样子 def item a
  • 尝试使用 Rails 和 PostgreSQL 生成模型时,命令挂起且没有错误

    使用该命令时 rails generate model Event name string 什么也没发生 我必须按 CTRL c 我使用的版本是 红宝石 2 1 1p76 导轨4 1 0 PostgreSQL 9 3 4 Mac OS X
  • 思考狮身人面像和控制台

    我在 webfaction 上思考 sphinx 时遇到问题 当我在 osx 上本地执行时没有问题 I search gt gt ThinkingSphinx 搜索 雷蒙德 我的回应是这样的 gt 有任何想法吗 thx sg 如果你还没有

随机推荐

  • 可以信任第三方主机进行闭源/私有源代码管理吗? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 对于许多公司来说 他们项目的源代码对他们来说非常有价值 窃取源代码可能会造成非常高昂的代价 在本地网络上严格控制源代码是帮助保护源代码
  • npm 依赖冲突

    我正在使用 Vue 开发一个项目 我运行 Vue Cli 并添加了 Typescript 插件 我有几个弱点 当我跑步时npm audit fix它无法解决依赖冲突 npm ERR code ERESOLVE npm ERR ERESOLV
  • Airflow连接密码解密

    我想解密气流连接的密码 从连接表中获取值 有什么方法可以解密密码值 你可以做 from airflow hooks base hook import BaseHook connection BaseHook get connection c
  • Material-ui 芯片 - 拖放支持

    我想用材料 UI 芯片 https material ui com demos chips 在我的反应应用程序中 问题是我想通过拖放来移动芯片 不支持此功能material ui 是否有解决方法 扩展来使芯片可拖动 如果没有其他办法的话 我
  • Android 库项目作为 jar 文件进行分发,例如 google Analytics

    我见过this https stackoverflow com questions 5014128 create an android jar library for distribution问题 并且对创建一个我可以分发并可以在任何 An
  • 按天自动分区 - PostgreSQL

    我想做一个日常分区 我知道oracle是这样的 CREATE TABLE PUBLIC TEST ID NUMBER 38 0 NOT NULL ENABLE SOME FIELD VARCHAR2 20 BYTE NOT NULL ENA
  • Puppeteer:如何聆听特定的回应?

    我正在修补名为的无头 chrome 节点 apipuppeteer 我想知道如何听取特定的请求响应以及如何采取行动 我已经查看了事件requestfinish and response但它给了我all页面中已执行的请求 响应 我怎样才能实现
  • 意图在android中拍摄视频

    我需要仅使用前置摄像头从我的应用程序中拍摄视频 我正在使用意图来执行此操作 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE intent putExtra MediaStor
  • 在 JBehave Web 中运行 FirefoxWebDriverProvider 时如何更改浏览器窗口的大小

    我们正在使用 JBehave Web 来驱动新项目的 selenium 测试套件 并且非常喜欢 JBehave 上提供的 Etsy com 示例 尤其是 Java Spring maven 原型 因为这适合我们的架构 到目前为止最大的问题是
  • 如何将表转储到控制台?

    我在显示包含嵌套表 n 深 的表的内容时遇到问题 我想通过 a 将它转储到标准输出或控制台print声明或一些快速而肮脏的东西 但我不知道如何 我正在寻找打印时得到的粗略等价物NSDictionary使用gdb 如果需求是 又快又脏 我发现
  • 无法导入名称“BlockBlobService”

    我收到以下错误 from azure storage blob import BlockBlobService ImportError cannot import name BlockBlobService 当尝试使用命令提示符运行我的 p
  • MongoDB $lookup 值返回数组

    我有一个包含多个项目的文档 需要从另一个集合中查找更多信息来填写数据 主要文件 id ObjectID 5a30ff41af58f911946b122e SalesItems SalesItemID 1139 Quantity 2 Amou
  • 为 C++ 多维类指针创建初始化和删除函数

    我创建了一个类并使用多维指针 如下所示 variable v mod v mod new variable 3 for int i 0 i lt 3 i v mod i new variable n 并在使用后删除指针 for int i
  • 如何更改最新发布的 Visual Studio Code 中的默认浏览器?

    正如标题所说 默认浏览器是IE 但我想使用其他浏览器 我该怎么办 您可以将 Windows 默认设置程序更改为您的浏览器 Windows 7的 控制面板 gt 程序 gt 设置默认程序
  • 从 DLL 导出静态 lib 符号

    我正在将 Facade DLL 用于静态库 Dll 提供了一个小型接口和资源管理 可以在多个 DLL 之间共享 Dll Header 确实公开了静态库中的内容 class DLL EXPORT MyDllClass public OneSt
  • Android 通知 FCM 与简单拉取

    对于我的 Android 应用程序 我需要从服务器接收一些通知 通知的时间要求并不严格 当用户打开应用程序时检查新通知就足够了 因此根本没有后台活动 我注意到 建议使用 FCM Firebase Cloud Messaging 之类的服务来
  • 用对象项填充 listView 的正确方法?

    在我的 NativeScript 项目中 我尝试使用自定义对象 定义为接口 的实例填充 ListView 但输出 在 Android 模拟器上 非常奇怪 我在多行中生成了 object object object 而不是按照我的定义获取每个
  • python不确定性包中的零除错误

    为什么会出现以下零除错误 gt gt gt from uncertainties import ufloat gt gt gt a ufloat 0 0 gt gt gt x ufloat 0 3 0 017 gt gt gt a x Tr
  • 控制 lme4 1.0.* 中的最大迭代次数

    我使用 R 中的 glmer 命令 来自 lme4 包 估计了随机系数风险模型 该命令如下所示 logit full lt glmer event V12 I V1 2 V13 V9 I V5 2 V11 V10 V2 V3 V4 V6 V
  • 允许匿名/来宾用户“尝试”功能,而无需在 Rails/Devise/CanCan 应用程序中注册

    我正在使用 Devise 和 CanCan 开发 Rails 3 应用程序 该应用程序允许匿名 未注册 用户访问该应用程序的某些部分 并允许注册用户访问其他部分 该应用程序 瑜伽锻炼应用程序 的一个方面是 用户可以通过将瑜伽姿势串在一起来创