Task create and update

This commit is contained in:
2025-07-12 18:00:56 +03:00
parent 4f5b9dcf89
commit 586f2cf3ee
7 changed files with 132 additions and 8 deletions
+42 -7
View File
@@ -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
View File
@@ -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)
+18
View File
@@ -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
+22
View File
@@ -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
+22
View File
@@ -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
+13
View File
@@ -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'
+14
View File
@@ -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'