我有点像Rails新手,不太确定将用户绑定到他们的对象(如文档)时的约定是什么。(我现在知道遵循Rails中的惯例是多么重要)
到目前为止,我已经在脑海中想出了3个潜在的解决方案:
- 使用
has_many
和belongs_to
,使每个文档本质上都是每个用户的子文档 - 给每个文档一个整数(
user_id
或类似的整数),将其与用户联系起来。这样,每当用户想要文档的索引时,我就可以识别所有具有正确ID的文档 - 似乎有一些插件完全以自己的方式进行用户管理,但不适合上述任何一种
此外,我计划使用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
关系将documents
与users
关联起来。。。
--
为了给您一些上下文,您必须将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
这将允许类似以下内容(使用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_many
、belongs_to
)。
您可以使用design进行身份验证(或者构建自己的登录系统,有railscast并使用cancancan进行授权。您可以在文档中找到一些功能定义例如
can :update, Article
或者如果用户可以删除自己的东西
can :read, Project, active: true, user_id: user.id
我还将使用与has_many
(例如)和has_many through
的ActiveRecord关系