今日やること

## 今日やりたいこと

```ruby:

🍽 テーマ：レシピ管理アプリ
dish_name（料理名）
ingredients（材料）
steps（作り方）
category（和食・洋食 / 中華）
status（作った／作ってない）

映画管理アプリ
title（映画タイトル）
director（監督）
genre（SF・ホラーなど）
status（観た／観てない）

ログイン機能勉強できたら、次Ajax

その次は、テーブル設計(複数テーブル作って関連付ける + SQLAcademy)
```

### 削除ダイアログ表示

```ruby:
onclick="return confirm('削除していい？');
```

# SQLavademy 初期設定

https://qiita.com/k8p4tw/items/214bd831f0869c23bae1

## return render_template_string("""の書き方　追加例

```ruby:これの手前にいつも追加
""", books=books
```

```ruby:before
</ul>
    """, books=books)
```

```ruby:after
</ul>
[<a href="/">料理一覧へ</a>]
    """, books=books)
```

### 登録日表示

```ruby: モデルに登録日カラム追加
from datetime import datetime

    created_at = db.Column(db.DateTime, default=datetime.now)
```

### 検索機能

```ruby:
keyword = request.args.get("q", "")
    sort = request.args.get("sort", "created_at")

    books = Book.query
    if keyword:
        books = books.filter(
            Book.title.contains(keyword) | Book.author.contains(keyword)
        )
```

### モデルを変えたら、DBを作り直さないとこのエラーに

![スクリーンショット 2025-04-26 17.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/2c991bf9-f998-408a-98c6-fa80d3c1c53a.png)


### DB作り直し方 run.pyを再起動か手動でDB作り直し(全部コマンド)

```ruby:
" .db"ファイル消す
python

from app.app import app

app.app_context().push()

db.create_all()

サーバー再起動
```

### DB作り直しでこのエラー出たら

![スクリーンショット 2025-04-26 17.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/bef40680-75fc-4b8a-9982-2a09948c3d04.png)

```ruby:これ実行
python

from app.app import app, db

app.app_context().push()

db.create_all()

サーバー再起動
```

### dbできてたら、このファイルができる

![スクリーンショット 2025-04-26 17.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/f3d8e236-9b1e-4257-a2eb-065a77f2648c.png)

### 作られた順(created_at)で検索

```ruby:html
<option value="created_at" {% if request.args.get('sort') == 'created_at' %}selected{% endif %}>新しい順</option>
```

```app.py
else:
        books = books.order_by(Book.created_at.desc())
```


### タイトル順で検索

```ruby:html
<option value="title" {% if request.args.get('sort') == 'title' %}selected{% endif %}>タイトル順</option>
```

```app.py
if sort == "title":
        books = books.order_by(Book.title.asc())
```

### タグ機能追加　モデル

```ruby:
tags = db.Column(db.String(200), nullable=True)
```


## 検索機能 タイトル/作成日時/ステータスで調べたい

```ruby:考え方
if sort == タイトルで調べたら
    使ってるモデル名小文字(books) = タイトルで調べた結果を表示
elif sort == ステータスで調べたら
    使ってるモデル名小文字(books) = ステータスで調べた結果を表示
else:
    使ってるモデル名小文字(books) = 作成日時で調べた結果を表示
```

```ruby:sample
if sort == "title":
    books = books.order_by(Book.title.asc(), Book.status.asc(), Book.tags.asc())
elif sort == "status":
    books = books.order_by(Book.status.asc())
else:
    books = books.order_by(Book.created_at.desc())


if sort == "title":
    books = books.order_by(Book.title.asc(), Book.status.asc(), Book.tags.asc()
elif sort == "status":
    books = books.order_by(Book.status.asc())
elif sort == "tags":
    books = books.order_by(Book.status.asc())
else:
    books = books.order_by(Book.created_at.desc())
```

## 作成日時順 / タイトル順で並び替え

![スクリーンショット 2025-04-27 13.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/fc8c4c5a-4f9c-4c04-9537-8b02d981a8b1.png)

```ruby:並び替えボタン
<select name="sort">
                <option value="created_at" {% if request.args.get('sort') == 'created_at' %}selected{% endif %}>新しい順</option>
                <option value="title" {% if request.args.get('sort') == 'title' %}selected{% endif %}>タイトル順</option>
            </select>
```
```ruby:タイトルで検索
keyword = request.args.get("q", "")
```

```ruby:作成順で検索
sort = request.args.get("sort", "created_at")
```

```ruby:タイトルがあったら、タイトルにあったデータを全部取り出す
if keyword:
        books = books.filter(
            Book.title.contains(keyword) |
            Book.author.contains(keyword) |
            Book.tags.contains(keyword) |
            Book.memo.contains(keyword)
        )
```

### タイトルと作成日時順で調べる　code全文

```ruby
keyword = request.args.get("q", "")

※ルール : 何も検索されなかったら、デフォルトは作成順で検索される ↓ 
    sort = request.args.get("sort", "created_at")
    books = Book.query
    if keyword:
        books = books.filter(
            Book.title.contains(keyword) |
            Book.author.contains(keyword) |
            Book.tags.contains(keyword) |
            Book.memo.contains(keyword)
        )
    books = books.order_by(Book.title.asc() if sort == "title" else Book.created_at.desc())
```

### ステータスを設定し、編集画面でステータス編集

```ruby:編集
statuses = ["未読", "読んでる", "読了"]  

# render_templateにstatus追加
return render_template("edit.html", book=book, statuses=statuses)
```

```ruby:html
<form method="POST">
    <label for="status">Status:</label>
    <select name="status" id="status">
        {% for status in statuses %}
            <option value="{{ status }}" {% if status == book.status %}selected{% endif %}>{{ status }}</option>
        {% endfor %}
    </select>
    <button type="submit">Save</button>
</form>
```

### ジャンル設定し、編集画面でジャンル編集

```ruby:app.py
tags = ["ギャグ", "ホラー", "冒険", "恋愛", "泣ける"]  # 例：ステータス一覧

return render_template("edit.html", book=book, manytag=manytag)
```

```ruby:html
<form method="POST">
    <label for="tags">Tags:</label>
    <select name="tags" id="tags">
        {% for tags in manytag %}
            <option value="{{ tags }}" {% if tags == book.tags %}selected{% endif %}>{{ tags }}</option>
        {% endfor %}
    </select>
    <button type="submit">保存</button>
</form>
```

### タイトルとタグ / ステータスで検索

```ruby:
keyword = request.args.get("q", "")
# ルール : 何も入力されなかったら、タグで検索(デフォルト)↓
sort = request.args.get("sort", "tags")

books = Book.query

if keyword:
    books = books.filter(
        Book.title.contains(keyword) |
        Book.author.contains(keyword) |
        Book.tags.contains(keyword) |
        Book.status.contains(keyword) |
        Book.memo.contains(keyword)
    )

if sort == "title":
    books = books.order_by(Book.title.asc())
elif sort == "tags":
    books = books.order_by(Book.tags.asc())
elif sort == "status":
    books = books.order_by(Book.status.asc())
else:
    books = books.order_by(Book.created_at.desc()) 
```