3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】自分しか使わないタスク管理アプリをRubyだけで作ってみた

Last updated at Posted at 2024-11-04

どうもこんにちは。

今回は、Rubyの勉強がてら、ターミナルで使用するタスク管理アプリをRubyだけで作ってみました。

RailsのようにHTMLを使用してUIを作成するわけではないです。
ターミナルで使用する簡素なタスク管理アプリです。

前提

Rubyがインストールされていることを前提に話を進めます。

手順

1. 作業ディレクトリ準備

mkdir only_ruby_task_app && cd only_ruby_task_app

2. rubyファイル生成

touch app.rb

3. コード記述

今回は、エディタ使いません。ターミナルで完結させます。

vi app.rb

以下をコピペします。

app.rb
require 'json'
require 'colorize'

# タスクデータを定義するクラス
class Task
  attr_accessor :id, :title, :completed

  def initialize(id, title, completed = false)
    @id = id
    @title = title
    @completed = completed
  end

  def to_hash
    {
      id: @id,
      title: @title,
      completed: @completed
    }
  end
end

# タスク管理クラス
class TaskManager
  DATA_FILE = 'tasks.json'

  def initialize
    @tasks = load_tasks
  end

  def add_task(title)
    id = next_id
    task = Task.new(id, title)
    @tasks << task
    save_tasks
    puts "タスク「#{title}」を追加しました。ID: #{id}"
  end

  def list_tasks
    if @tasks.empty?
      puts "タスクはありません。"
    else
      puts "タスク一覧:"
      @tasks.each do |task|
        status = task.completed ? "[完了]" : "[未完了]"
        puts "#{task.id}. #{status} #{task.title}"
      end
    end
  end

  def complete_task(id)
    task = find_task(id)
    if task
      task.completed = true
      save_tasks
      puts "タスク「#{task.title}」を完了にしました。"
    else
      puts "ID #{id} のタスクが見つかりません。"
    end
  end

  def delete_task(id)
    task = find_task(id)
    if task
      @tasks.delete(task)
      save_tasks
      puts "タスク「#{task.title}」を削除しました。"
    else
      puts "ID #{id} のタスクが見つかりません。"
    end
  end

  private

  def load_tasks
    if File.exist?(DATA_FILE)
      data = JSON.parse(File.read(DATA_FILE))
      data.map { |t| Task.new(t['id'], t['title'], t['completed']) }
    else
      []
    end
  end

  def save_tasks
    data = @tasks.map(&:to_hash)
    File.open(DATA_FILE, 'w') do |f|
      f.write(JSON.pretty_generate(data))
    end
  end

  def next_id
    if @tasks.empty?
      1
    else
      @tasks.map(&:id).max + 1
    end
  end

  def find_task(id)
    @tasks.find { |task| task.id == id }
  end
end

def display_menu
  puts "\nタスク管理アプリ"
  puts "1. タスクを追加"
  puts "2. タスクを一覧表示"
  puts "3. タスクを完了"
  puts "4. タスクを削除"
  puts "5. アプリを終了"
  print "選択してください(1-5):"
end

def main
  manager = TaskManager.new

  loop do
    display_menu
    choice = gets.chomp

    case choice
    when '1'
      print "タスクのタイトルを入力してください: "
      title = gets.chomp
      if title.strip.empty?
        puts "タイトルは空にできません。"
      else
        manager.add_task(title)
      end
    when '2'
      manager.list_tasks
    when '3'
      print "完了にするタスクのIDを入力してください: "
      id = gets.chomp.to_i
      manager.complete_task(id)
    when '4'
      print "削除するタスクのIDを入力してください: "
      id = gets.chomp.to_i
      manager.delete_task(id)
    when '5'
      puts "アプリを終了します。"
      break
    else
      puts "無効な選択です。1から5の数字を入力してください。"
    end
  end
end

# アプリケーションの実行
main

4. 起動!

ruby app.rb

こんな感じで表示されればOK!

スクリーンショット 2024-11-03 10.57.12.png

でも白黒で読みづらい...

よし、文字に色をつけよう!

5. 色をつけるためのGemをインストール

gem install colorize

6. app.rbでrequire

# ファイルの上の方に記述
require 'colorize'

7. 出力する文字列に色を指定

# display_menuメソッドに出力する文字列あります!

def display_menu
  puts "\nタスク管理アプリ".cyan
  puts "1. タスクを追加".green
  puts "2. タスクを一覧表示".green
  puts "3. タスクを完了".green
  puts "4. タスクを削除".green
  puts "5. アプリを終了".red
  print "選択してください(1-5):".yellow
end

8. いざ実行!

スクリーンショット 2024-11-03 11.00.01.png

いい感じ!

追加したタスクは、データベースじゃなくてJSONファイルで管理するようにしています。
原始的ですが、単純明快で使いやすいです。

以上

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?