Railsチュートリアルを1周した後に、図書館サービスを作ってみた

# はじめに

4月にRailsチュートリアルを始めて、6月の初めに1周しました
まだ理解があいまいなところもあったので、何か作りたいと思いました
そこで、会社では本の貸出を紙で管理していたので、Railsチュートリアルを真似して本の貸出情報を管理するサービスを作ってみることにしました

- GitHubのリポジトリ

https://github.com/it31415/book_app

- Webサイト

https://aqueous-coast-43178.herokuapp.com/

会社で実際に使うサイトと自分用のサイトを2つ作りました
ここで公開しているのは自分用のサイトです
「図書館サービスを作りました！」と会社のSlackに書いたら、初日から3人の方に使ってもらえました！

# デザイン

Bootstrapを使いました
ほとんどRailsチュートリアルの真似です

- ホームページ
<img width="1211" alt="スクリーンショット 2019-07-13 17.02.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257093/94000498-dc0f-f9ff-69db-7f7ab15b16b4.png">
- 一覧ページ
<img width="1174" alt="スクリーンショット 2019-07-13 17.02.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257093/02eb9f84-6ed1-80fc-fe9b-c1cbb72dbc1b.png">
- 貸出ページ

返却日(Checkout date)にはデフォルトで今日の日付を入れてあります
<img width="1195" alt="スクリーンショット 2019-07-13 17.02.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257093/2bcab921-1e7b-ca27-da4b-0807019ef5f6.png">

# 環境

- Mac OS Mojave 10.14.5
- Ruby 2.6.1
- Rails 5.1.6.2
- herokuにデプロイ

# コード

メインとなるcontrollerのファイルだけ載せます
Railsチュートリアルにある

- index
- show
- new
- create
- edit
- update
- destroy

に加えて、returnアクションを追加しました
これは、返却リンクを押すと返却日に今日の日付が入る機能です

```ruby:circulations_controller.rb
class CirculationsController < ApplicationController

  def index
    @circulations = Circulation.order(:checkout_date, :id)
  end

  def show
    @circulation = Circulation.find(params[:id])
  end

  def new
    @circulation = Circulation.new
    @circulation.checkout_date = Date.today
  end

  def create
    @circulation = Circulation.new(circulation_params)
    if @circulation.save
      flash[:success] = "図書館サービスへようこそ!"
      redirect_to @circulation
    else
      render 'new'
    end
  end

  def edit
    @circulation = Circulation.find(params[:id])
  end

  def update
    @circulation = Circulation.find(params[:id])
    if @circulation.update_attributes(circulation_params)
      flash[:success] = "貸出情報が更新されました！"
      redirect_to @circulation
    else
      render 'edit'
    end
  end

  def return
    @circulation = Circulation.find(params[:id])
    if @circulation.update(return_date: Date.today)
      flash[:success] = "本を返却しました！"
      redirect_to circulations_url
    else
      render 'edit'
    end
  end

  def destroy
    Circulation.find(params[:id]).destroy
    flash[:success] = "貸出情報を削除しました"
    redirect_to circulations_url
  end

  private

    def circulation_params
      params.require(:circulation).permit(
        :user_name,
        :book_name,
        :checkout_date,
        :return_date
      )
    end
end

```

# かかった時間

- リポジトリを作ってherokuにHello Worldを表示させるのに2時間
- newとcreateで5時間
- 残りの機能で5時間

かかった日数は3日で、実際の時間は10数時間でした
慣れてる人なら数時間で作れると思います
サービスのプロトタイプを素早く作れるのはRailsの素晴らしいところですね！

# 意識した点

初めは

- ユーザの管理機能
- 本の管理機能
- 貸出情報の管理機能

を土日で全部作ろうと思っていました
しかし、実際にやっているうちに「全部作ってたら土日に終わんねえ...」状態になってしまいました笑

そこで、とりあえず貸出情報の管理機能だけ作って少しずつ改良していくことにしました

FacebookのCEOのマーク・ザッカーバーグも『完璧を目指すよりまず終わらせろ』と言っていました
完璧を最初から目指していたらいつまで経っても完成せず、結局中途半端で辞めてしまうことも多いと思います
だから、とりあえず動くものを作ってから少しずつ良くする方が速く公開できますし、意見も聞けるのでいいかなと思います

# 今後追加したい機能

とりあえず紙での管理の代わりになるものを作っただけなので、今後少しずつ機能を追加していきます

- AWSにデプロイ
- 会社のネットワークからのみアクセスを許可する
- 蔵書管理
- Slackと連携させて、本の返却を促す
- ログイン機能

など

RSpecでテストも書くつもりです

# おわりに

最後まで読んでいただきありがとうございました。
QiitaやTwitterなどにコメントをしてもらったり、SNSでシェアしてもらえるとうれしいです！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Railsで作った図書館サービスの内容をQiitaに投稿しました！<br><br>自分で作ってみると楽しいし理解が深まりますね！<br><br>GitHub<a href="https://t.co/x512lph9LV">https://t.co/x512lph9LV</a><br><br>Webサイト<a href="https://t.co/zaOGDyTyGJ">https://t.co/zaOGDyTyGJ</a><br><br>Railsチュートリアルを1周した後に、図書館サービスを作ってみた <a href="https://t.co/JL7X4ezYRI">https://t.co/JL7X4ezYRI</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/BBtvCbtwGL">pic.twitter.com/BBtvCbtwGL</a></p>&mdash; ITのんびり@V字回復エンジニア (@it31415) <a href="https://twitter.com/it31415/status/1149997184252698624?ref_src=twsrc%5Etfw">2019年7月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>