在Ruby on Rails中管理用户(& ownership)

时间:2016-01-02 05:39:43

标签: ruby-on-rails ruby devise

我有点像Rails新手,并且不太确定将用户绑定到对象(例如文档)时的约定。 (我现在知道在Rails中使用约定是多么重要)

到目前为止,我已经想出了3个可能的解决方案:

  1. 使用has_manybelongs_to
  2. 使每个文档基本上成为每个用户的子项
  3. 为每个文档提供一个整数(user_id,或类似的东西),将其与用户联系起来。这样,只要用户想要他们的文档索引,我就可以识别所有具有正确ID的索引。
  4. 似乎有一些插件完全以自己的方式完成用户管理,不适合上述任何一种。
  5. 此外,我计划使用Devise进行用户身份验证和管理。根据我的理解,这似乎是最受欢迎/广泛使用的认证宝石 - 如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:1)

这主要是基于意见的问题,但我倾向于看到大多数项目使用ActiveRecord的关系(例如has_manybelongs_to)。

答案 1 :(得分:1)

您可以使用设计进行身份验证(或构建自己的登录系统there is a railscast并使用cancancan进行授权。您可以在documentation找到一些能力定义 仅举例来说

can :update, Article

或者如果用户可以删除自己的东西

can :read, Project, active: true, user_id: user.id

我也会使用与has_many的ActiveRecord关系,例如和has_many through

答案 2 :(得分:1)

  

我有点像Rails新手

欢迎来到俱乐部,虽然有些人咬人,但大多数都很酷。

  

将用户绑定到他们的对象

您已经answered your own question ...

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :documents
end

#app/models/document.rb
class Document < ActiveRecord::Base
   belongs_to :user
end

如果用户创建了文档,那么这肯定意味着您必须通过documents / users关系将has_manybelongs_to关联起来。

-

为了向您提供一些背景信息,您必须将user_id foreign_key添加到documents表中:

$ rails g migration AddUserForeignKeyToDocuments

#db/migrate/add_user_foreign_key_to_documents______.rb
class AddUserForeignKeyToDocuments < ActiveRecord::Migration
   def change
      change_table :documents do |t| 
         t.references :user, index: true
      end
   end
end

$ rake db:migrate

这将允许类似以下内容(使用current_user helper from Devise):

#config/routes.rb
resources :documents

#app/controllers/documents_controller
class DocumentsController < ApplicationController
   def create
      @document = current_user.documents.new document_params
      @document.save
   end

   private

   def document_params
      params.require(:document).permit(.....)
   end
end

如果您不确定用户身份验证,则应使用Devise,尽管还有其他身份验证宝石,例如sorcery

设置Devise很简单:

#Gemfile
gem 'devise', '~> 3.5', '>= 3.5.3'

$ rails generate devise:install
$ rails generate devise User
$ rake db:migrate

#config/routes
devise_for :users

#app/controllers/documents_controller.rb
class DocumentsController < ApplicationController
   before_action :authenticate_user!
end

这样,只有登录的用户才能访问/documents:)