Rails初心者へ向けブログアプリのサンプルを作りました

Railsを学び始めの方の人へ向けブログアプリのサンプルを作成しました。

☆ RailsブログサンプルのURL
http://yos-rails-blog-sample.herokuapp.com

☆ githubのソースコード
https://github.com/yoshioota/rails-blog-sample

細かい説明をしだすと長くなってしまうので、ポイントに絞って説明していきます。

その前にこのサンプルを動作させるための環境について。

■ 環境
Ruby 2.1.2
Rails 4.1.4
PostgreSQL
※ ruby2.1.2のインストール方法
http://qiita.com/217/items/2d4f2d9551572e2c7352
http://qiita.com/ryam/items/33803f9a442399b60232

※ postgresqlはhomebrewにて入れましょう

■ Railsをプログラムするのにおすすめエディタ
RubyMine(better_errors, rails-footnotesでruby mineを設定しています。)
とりあえず無料で30日つかえるので入れてみるのをおすすめします
http://www.jetbrains.com/ruby/

■ Rails開発を10倍楽にするgem
以下の3つのgemはとっても良いです。マジおすすめです。是非入れてみてください!

・better_errors
=> 例外が出た箇所で処理がとまり、そこでコマンドを打つことが出来る
設定することによりその箇所をRubyMineで開くことが可能
http://qiita.com/yoshioota/items/3faadd7a1b6c7fd88e3b

・rails footnotes
viewの一番下にそのviewのコントローラーをRubyMineで開くリンクを付けてくれる。
http://qiita.com/yoshioota/items/3faadd7a1b6c7fd88e3b

・guard-livereload
ソースコードを更新し保存したら、それを自動で検知し、Chromeを再読み込みしてくれる。
http://qiita.com/TAKAyuki_atkwsk/items/737066dd15b9886f5dad

===============

では、今回のブログアプリの説明をしたいと思います。

■ ブログアプリ要件
・各ユーザーがブログ記事を書くことが出来る。

・記事は下書状態と公開状態があり、下書き状態であれば一般公開されることは無い。

・記事はマークダウンにて書くことが出来る。

gem redcarpet にて実現

・記事に対してコメントを書くことが出来る。

・ユーザー登録はメールアドレスにて行う。

※ ユーザ登録部分はdeviseでサクッとつくってあります。
メールの実在確認はしていないので、もし確認をしたい場合はdeviseのconfirmable等を調べてみてください。

・退会処理時、ユーザー情報・データは物理削除をする。

もし論理削除をしたい場合は、rails4だとkakurenboとかを使用すると良いかも。
http://alfa.hatenablog.jp/entry/2014/01/26/225852

■ ディレクトリ構成について
・ログイン後ページのソースはcontrollers/home以下に配置
・設定系はcontrollers/home/settings以下に配置

■ 更新系actionに予めaround_filterでtransactionをかけておきます。

更新系actionは基本的にトランザクションをかけるような処理が多いかと思います。
なので先回りしてトランザクションを書けるようにしておくと値がぶっ壊れた！！みたいな事が起きずに幸せになれます。

https://github.com/yoshioota/rails-blog-sample/blob/master/app/controllers/application_controller.rb#L8
のwrap_transactionがその処理となってます。

■ パンくずリストのつくり方
今回はgemを使わず普通にかきました。２通りの書き方をしてあります。今後ソースを追加していった時にしっくりきたほうに寄せようかなと。

とりあえずApplicationControllerにて@breadcrumbsを初期化し
1. 各コントローラーにてadd_breadcrumbをする
2. include AddBreadcrumbsをして、一つのモジュールに設定を集約する(ただしdef show等で個別の文言をパンくずに入れたいときはdef showの中に追加することになり、どうなんかなーと思ったり)
https://github.com/yoshioota/rails-blog-sample/blob/master/app/controllers/concerns/add_breadcrumbs.rb


どっちがいいんでしょうかね、

■ パスワード変更のformはactivemodelを使用
https://github.com/yoshioota/rails-blog-sample/blob/master/app/models/change_password.rb
modelっぽく使用できて便利なのでこう言う時はactivemodelを使用しましょう。
ちなみにuser.rbにattr_accessorで追加することは出来るのですが、責務が違うため、おすすめしません。
それにuser.rbも大きくなっちゃうしね。

■ 記事コメントの処理はcreate.js.erbの中にjsを書きそこで処理
ちょっと手抜きっぽいけど、軽くAjaxのレスポンスを返すのはこれが１番楽です。
https://github.com/yoshioota/rails-blog-sample/blob/master/app/controllers/home/comments_controller.rb#L3
https://github.com/yoshioota/rails-blog-sample/blob/master/app/views/home/comments/create.js.erb

▶ 失敗した場合
エラー状態のフォームを返す
 
▶ 成功した場合
空にしたフォームと書き込まれたコメント一覧を返す
[TODO] 全体のコメントを返すのはコストが高いので、今回作成したフォームだけを追加するように書き換えると良いです。

■ 状態遷移にはaasmを使用
Article(記事)の状態は下書き状態と公開状態の２つが有り、これらの状態の遷移をするに当たりaasmを使用します。
ぶっちゃけ２つ位ならいらないっちゃいらないんですが状態が多くなるにつれ
この手の状態遷移ライブラリの力を借りることになるので今のうちに使い方を覚えておきましょう。
https://github.com/aasm/aasm
rails-blog-sampleで使用してる箇所
https://github.com/yoshioota/rails-blog-sample/blob/master/app/models/article.rb

---

こんな感じです。
なんかブワーッとかいてしまってまとまりが無い気がするのは、気にしないっ。
今回のサンプルでわからないこと、質問、意見等が有りましたらコメントください！

あと今回作って無かったんですが、管理画面をつくらないと行けないですね。
つぎのサンプルでは管理画面も作りたいと思います(多分)！