ruby-on-rails - 如何让设备与多个模型或角色一起工作? (最好使用 CanCan 和 rolify)

标签 ruby-on-rails devise cancan rolify

使用devise ,拥有多个模型或角色的最佳方式是什么? 以下是我的应用程序中需要的模型或角色:

-Author: can upload content to the site
-Customer: pays a monthly fee to access the content

用户可以同时是作者和客户。我认为他们可以共享相同的登录表单,因为他们都会使用自己的电子邮件地址登录。

我尝试过使用CanCanrolify ,但不知道如何在注册过程中添加不同的角色。当用户注册为作者时,他应该被赋予“作者”角色,当用户通过支付月费注册时,他应该被赋予“客户”角色。我也不想对角色使用复选框。

有一个名为“作者”的导航链接,允许作者注册,然后有一个链接供用户通过付款和账单表格进行注册。根据单击的链接,应确定指定的角色。我是否应该在注册期间在 url 中传递角色参数,例如 "user/sign_up/index?role=customer"?如果是这样,我如何才能在注册过程中使用它?

使用 devise、CanCan 和 rolify,我该如何解决这个问题?我认为最好有一个 User 类,然后让 Customer 和 Author 从 User 扩展,但从阅读 StackOverflow 上的许多类似问题来看,rolify 似乎更容易。

我知道我想做的是非常基本的,我只是还没有弄清楚。我一整天都在努力寻找解决方案。

更新: 下面丹尼的回答将我推向了正确的方向,我通过在 URL“users/sign_up?role=customer”或“users/sign_up?role=author”中传递参数,成功地在注册过程中正确添加了角色。我不知道这是否是最好的方法,但这就是我到目前为止所拥有的。

我的一个问题是我的 has_many 关系现在将如何工作?这是我所拥有的:

class User < ActiveRecord::Base
    rolify
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

    has_one :plan
    has_many :files

end

has_one :plan is for the customer's subscription plan and has_many :files is for the author who can upload many files that the customer can download

问题是我还想跟踪用户的文件下载,所以我想放置 has_many :downloads 或可能 has_many :files, :through => :downloads

如果我将这些放入用户模型中,知道不允许非客户的作者下载文件并且非作者的客户无法上传文件,这有什么关系吗?

最佳答案

从你的问题中,我了解到你已经“深入”到了 rolify 和 cancan,所以我将专注于分配角色。

您通常会在 seeds.rb 文件中创建不同的角色,例如

[:admin, :author, :customer].each do |role|
  Role.find_or_create_by_name({ name: role }, without_protection: true)
end

当您将自己创建为管理员时,也可以在 seeds.rb 文件中使用

立即分配 :admin 角色
user.add_role :admin

对于您的其他角色,您可以“在适当的时候”分配它们,正如您所描述的那样。当用户单击作者链接并继续时,这会触发某些 Controller 中的某些操作。您可以通过使用相同的内容将此角色分配给该用户

user.add_role :author

您还可以分配角色,仅连接到某些对象。例如。作者仅是他自己创建的文档的作者。在这种情况下,您不想分配“一般”作者角色,但您将像这样分配它

user.add_role :author, document

在 Controller 的创建操作中,同时保存创建的文档。这种分配的替代方法是在模型的回调中执行此操作。

还有问题吗?就问吧!

关于ruby-on-rails - 如何让设备与多个模型或角色一起工作? (最好使用 CanCan 和 rolify),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21071693/

相关文章:

ruby-on-rails - 如何在发送 Restful POST/PUT API 之前使用 rails3.2.x 获取 CSRF token ,而无需来自服务器端的任何表单/UI?

ruby-on-rails - 简单表单错误通知

ruby-on-rails - 在 CanCan 中使用 block 定义能力会引发异常

ruby-on-rails - 使用 cancan 时如何设置范围集中分配?

ruby-on-rails - 可安装引擎的实际用途是什么?

ruby-on-rails - `bundle install` 在 EC2 实例上失败

ruby-on-rails - 使用 Rails API 进行设计 - current_user

ruby-on-rails - CanCan 的 Spree 订单

ruby-on-rails - Ruby on Rails - 回形针错误

ruby-on-rails - 如何更改 shoulda 匹配器的主题