设计多种模型和多种登录表单

Cur*_*ind 5 authentication ruby-on-rails devise ruby-on-rails-3

我正在使用rails 3.2并设计2.1来创建一个多站点CMS

要求

  • 基于Basecamp子域的站点.
  • 有3个"用户"型号.1.管理员(超级用户)2.作者(每个子域都有自己的站点)和订阅者(​​阅读站点).
  • 作者:注册是普通的用户名/密码组合,但需要得到管理员的批准.他们的注册表格将有子域名.
  • 订阅者:通过邀请电子邮件进行注册.
  • 需要单独的登录和注册表格

可能的解决方案

我一直在寻找并找到一些解决方案

  • 3设计中的独立模型:
$ rails generate devise admin 
$ rails generate devise author
$ rails generate devise subscriber
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下错误

$ rails generate devise author /home/gaurish/.rvm/gems/ruby-1.9.3-p286-perf/gems/devise-2.1.2/lib/devise/rails/routes.rb:443:in 'raise_no_devise_method_error!': Admin does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)

  • STI:数据库中的单个表,并为每个用户类型创建一个模型

     class Admin < User; end
     class Author < User; end
     class Subscriber < User; end

在这里,我不确定这将如何处理不同的登录/注册工作流程.订阅者示例我计划使用devise_invitable创建邀请.与作者和订阅者不同,管理员不需要基于子域的范围.

这看起来很复杂吗?我希望我能够很好地解释.

jmc*_*mcd 4

您不需要拥有三个单独的模型来构建此功能。您想要了解的是应用于一个用户模型的角色概念。

有一个 Gem 提供了这种功能,称为 Rolify,可以在https://github.com/EppO/rolify找到

这将允许您指定哪些用户属于哪些角色,并根据您认为合适的方式更改它们,所有这些都来自一个现有模型。

将角色附加到用户模型后,您可以覆盖 Devise 的注册控制器来检测角色并呈现不同的模板等。您可以通过以下方式执行此操作:

  1. 运行rails generate devise:views以将 Devise gem 中的视图解压到您的项目中
  2. 创建您自己的注册控制器:

    # app/controllers/registrations_controller.rb
    class RegistrationsController < Devise::RegistrationsController
      def new
        super
        # Add logic here to detect Role and display different forms
      end
    
      def create
        super
      end
    
      def update
        super
      end
    end 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在routes.rb 文件中添加正确的设置,以告诉 Devise 使用新控制器:

    # app/config/routes.rb
    devise_for :users, :controllers => {:registrations => "registrations"}
    
    Run Code Online (Sandbox Code Playgroud)

  • 抱歉,但这并不能回答问题。请记住,“管理员”用户可能与“普通”用户完全不同,几乎没有或没有任何值得放在同一类中的用户。例如,如果您有一个电子商务应用程序,那么它让您的管理员拥有购物车、地址等有何意义?... (4认同)
  • 但是,在创建用户之前,注册控制器上的新操作如何知道角色是什么? (2认同)