2

使用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 用于客户的订阅计划, has_many :files 用于可以上传许多客户可以下载的文件的作者

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

如果我将这些放在 User 模型中,并且知道不允许非客户的作者下载文件并且非作者的客户不能上传文件,这是否重要?

4

1 回答 1

3

根据您的问题,我知道您已经“潜入”了 rolify 和 cancan,因此我将专注于分配角色。

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

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

当您将自己创建为管理员时,您会立即分配 :admin 角色,也在种子.rb 文件中,使用

user.add_role :admin

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

user.add_role :author

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

user.add_role :author, document

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

更多问题?就问吧!

于 2014-01-12T07:30:52.210 回答