Task create and update
This commit is contained in:
@@ -4,21 +4,56 @@ class TasksController < ApplicationController
|
|||||||
before_action :fetch_task, only: %w[show edit update delete]
|
before_action :fetch_task, only: %w[show edit update delete]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
if params[:project]
|
@project = fetch_project
|
||||||
@project = Project.find_by!(code: params[:project])
|
@tasks = if @project
|
||||||
@tasks = @project.tasks
|
@project.tasks
|
||||||
else
|
else
|
||||||
@tasks = Task.all
|
Task.all
|
||||||
end
|
end
|
||||||
|
|
||||||
@tasks = @tasks.includes(:project)
|
@tasks = @tasks.includes(:project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show; end
|
def show; end
|
||||||
|
|
||||||
|
def new
|
||||||
|
@form = Tasks::Create.new(project_id: fetch_project&.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@form = Tasks::Create.new(params.expect(task: %i[project_id title description]))
|
||||||
|
if @form.perform
|
||||||
|
redirect_to tasks_path(project: @form.project)
|
||||||
|
else
|
||||||
|
render :new, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@form = Tasks::Update.new(id: @task.id, title: @task.title, description: @task.description)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@form = Tasks::Update.new(params.expect(task: %i[title description]))
|
||||||
|
|
||||||
|
if @form.perform(@task)
|
||||||
|
redirect_to task_path(@task)
|
||||||
|
else
|
||||||
|
render :edit, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete; end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def fetch_project
|
||||||
|
return nil if params[:project].blank?
|
||||||
|
|
||||||
|
Project.find_by!(code: params[:project])
|
||||||
|
end
|
||||||
|
|
||||||
def fetch_task
|
def fetch_task
|
||||||
@task = Task.find_by_full_number_or_id!(params[:id])
|
@task = Task.includes(:project).find_by_full_number_or_id!(params[:id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ class Task < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.find_by_full_number_or_id!(number_or_id)
|
def self.find_by_full_number_or_id!(number_or_id)
|
||||||
return find!(number_or_id) if number_or_id.is_a?(Numeric) || number_or_id =~ /\A\d+\z/
|
return find(number_or_id) if number_or_id.is_a?(Numeric) || number_or_id =~ /\A\d+\z/
|
||||||
|
|
||||||
project_code, number = number_or_id.split('-')
|
project_code, number = number_or_id.split('-')
|
||||||
project = Project.find_by!(code: project_code.downcase)
|
project = Project.find_by!(code: project_code.downcase)
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ApplicationService
|
||||||
|
include ActiveModel::Model
|
||||||
|
include ActiveModel::Attributes
|
||||||
|
|
||||||
|
attr_reader :errors
|
||||||
|
|
||||||
|
def perform
|
||||||
|
# Override this
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def save(model)
|
||||||
|
model.save.tap { @errors = model.errors }
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Tasks
|
||||||
|
class Create < ApplicationService
|
||||||
|
attribute :project_id, :integer
|
||||||
|
attribute :title, :string
|
||||||
|
attribute :description, :string
|
||||||
|
|
||||||
|
validates :project_id, :title, presence: true
|
||||||
|
|
||||||
|
delegate :model_name, to: Task
|
||||||
|
|
||||||
|
attr_reader :project, :task
|
||||||
|
|
||||||
|
def perform
|
||||||
|
@project = Project.find(project_id)
|
||||||
|
|
||||||
|
@task = @project.tasks.build(title:, description:, number: @project.next_task_number)
|
||||||
|
@task.save.tap { @errors = @task.errors }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Tasks
|
||||||
|
class Update < ApplicationService
|
||||||
|
attribute :id, :integer
|
||||||
|
attribute :title, :string
|
||||||
|
attribute :description, :string
|
||||||
|
|
||||||
|
validates :title, presence: true
|
||||||
|
|
||||||
|
delegate :model_name, to: Task
|
||||||
|
|
||||||
|
def persisted? = true
|
||||||
|
|
||||||
|
def perform(task)
|
||||||
|
@task = task
|
||||||
|
@id = task.id
|
||||||
|
@task.assign_attributes(title:, description:)
|
||||||
|
save @task
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
h1
|
||||||
|
| Editing task
|
||||||
|
=< @task.full_number
|
||||||
|
|
||||||
|
= form_with model: @form do |form|
|
||||||
|
.field
|
||||||
|
= form.label :title
|
||||||
|
= form.text_field :title
|
||||||
|
.field
|
||||||
|
= form.label :description
|
||||||
|
= form.rich_textarea :description
|
||||||
|
.submit
|
||||||
|
= form.submit 'Update task'
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
h1 New task
|
||||||
|
|
||||||
|
= form_with model: @form do |form|
|
||||||
|
.field
|
||||||
|
= form.label :project_id
|
||||||
|
= form.select :project_id, Project.order(:name).map { |p| [p.name, p.id] }
|
||||||
|
.field
|
||||||
|
= form.label :title
|
||||||
|
= form.text_field :title
|
||||||
|
.field
|
||||||
|
= form.label :description
|
||||||
|
= form.rich_textarea :description
|
||||||
|
.submit
|
||||||
|
= form.submit 'Create task'
|
||||||
Reference in New Issue
Block a user