Last active
September 9, 2024 08:13
-
-
Save dhh/10022098 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# config/routes.rb | |
resources :documents do | |
scope module: 'documents' do | |
resources :versions do | |
post :restore, on: :member | |
end | |
resource :lock | |
end | |
end | |
# app/controllers/documents_controller.rb | |
class DocumentsController < ApplicationController | |
include ProjectScoped | |
def index | |
@documents = @project.documents | |
end | |
def show | |
@document = @project.documents.find(params[:id]) | |
end | |
def new | |
@document = Document.new | |
end | |
def create | |
@document = @project.documents.create! document_params.merge(creator: current_person) | |
end | |
end | |
# app/controllers/documents/locks_controller.rb | |
module Documents | |
class LocksController < ApplicationController | |
include DocumentScoped, ProjectScoped | |
def update | |
@document.lock!(current_person) | |
end | |
def destroy | |
@document.unlock!(current_person) | |
end | |
end | |
end | |
# app/controllers/documents/versions_controller.rb | |
module Documents | |
class VersionsController < ApplicationController | |
include DocumentScoped, ProjectScoped | |
before_action :set_version | |
def show | |
end | |
def restore | |
@document.restore!(@version) | |
end | |
private | |
def set_version | |
@version = @document.versions.find(params[:id]) | |
end | |
end | |
end | |
# app/controllers/concerns/document_scoped.rb | |
module DocumentScoped | |
extend ActiveSupport::Concern | |
included do | |
before_action :set_document | |
end | |
private | |
def set_document | |
@document = @project.documents.find(params[:document_id]) | |
end | |
end |
@dhh would you then apply this namespacing also for models?
So document's versions would go to document
folder as version.rb
with class Document::Version
? Same thing with locks to lock.rb
to document
folder with class Document::Lock
.
Final tree structure would be then
models/document/version.rb
models/document/lock
class Document::Version
# code here
end
or wrap those classes in plural module?
models/documents/version.rb
models/documents/lock
module Documents
class Version
# code here
end
end
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@dhh Wouldn't including
ProjectScoped
inDocumentScoped
make the module dependency explicit, and thus allow you to removeProjectScoped
's inclusion fromDocuments::VersionsController
andDocuments::LocksController
, avoiding the module ordering quirk entirely?Also, any particular reason why you call
Document.new
here, instead of@project.documents.build
?