ブログを作る(12) カテゴリ機能を付けた
2017-05-16
Tech記事にカテゴリを付けられるようにした。前からやりたかったものの一つである。ソースはこのへんだけど、ファイル構成の見直しも同時にやったのでこれだけ見てもよく分からないな。
同カテゴリの記事を探しやすくするというのが第一の目的だけど、もう一つの変更点として、日記(カテゴリDiary)を省いたAtomフィードを追加で提供するようにした。これを期にもうちょっと雑多な内容も書くようになるかもしれない。ならないかもしれないけど。
やったこと
- Categoryモデルを作成。各Postは0..1個のCategoryに属する。
- 編集画面にCategory選択フォームを追加。
- カテゴリ自体のCRUDは
/_config
を新設してそこでやるようにした。Twitterに書いたけど、disabled="disabled"
を付けることで削除ボタンの誤操作を回避している。コスパがよい(実装コストが低くて効果が大きい)ので好きなハック。
ブログにカテゴリの削除機能を付けようとしている。deleteボタンが無確認削除だと誤クリックが危ない。でも確認を実装するのはちょっと面倒だし、どうせ自分しか見ない画面だし、削除を押すのも誤入力したときくらいだと思われる。さて、どう作るのが楽だろうか?(僕の解答はあとで) pic.twitter.com/nECRkeu5c2
— yhara (Yutaka HARA) (@yhara) 2017年5月12日
こうしました(inputにdisabled="disabled"を付ける。押したいときは開発者コンソールでHTMLをいじる) pic.twitter.com/YH50f6rP23
— yhara (Yutaka HARA) (@yhara) 2017年5月12日
- あとは/_listをカテゴリでフィルタできるようにした。
既存の記事にカテゴリを振る
ここは半手作業でやった。DBを手元にダウンロードして、rake console
でirbを立ち上げる。以下のようにすると適当な形式のテキストファイルができるので、エディタで開いてカテゴリがTechじゃないやつを編集する。
> require 'pp'
> File.write("cats.txt", Post.all.map{|post| [post.id, "Tech", post.title]}.pretty_inspect)
終わったら以下のようにするとカテゴリが設定される。
> ary = eval(File.read("cats.txt"))
> ary.each{|id, cat_name, _| cat = Category.find_or_create_by!(name: cat_name); Post.find(id).update!(category: cat)}