在Ruby on Rails中管理用户(和所有权)



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

到目前为止,我已经在脑海中想出了3个潜在的解决方案:

  1. 使用has_manybelongs_to,使每个文档本质上都是每个用户的子文档
  2. 给每个文档一个整数(user_id或类似的整数),将其与用户联系起来。这样,每当用户想要文档的索引时,我就可以识别所有具有正确ID的文档
  3. 似乎有一些插件完全以自己的方式进行用户管理,但不适合上述任何一种

此外,我计划使用Devise进行用户身份验证和管理。据我所知,这似乎是最流行/最广泛使用的身份验证宝石——如果我错了,请纠正我。

我有点像Rails的新手

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


将用户绑定到他们的对象

你已经回答了自己的问题。。。

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

如果用户创建了一个文档,那肯定意味着您必须通过has_many/belongs_to关系将documentsusers关联起来。。。

--

为了给您一些上下文,您必须将user_idforeign_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

这将允许类似以下内容(使用Devise中的current_user助手):

#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:)

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

您可以使用design进行身份验证(或者构建自己的登录系统,有railscast并使用cancancan进行授权。您可以在文档中找到一些功能定义例如

can :update, Article

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

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

我还将使用与has_many(例如)和has_many through 的ActiveRecord关系

最新更新