Rubyはじめての人がRails開発に参加するときに最初に知っておくべきこと


※この内容はRailsで書かれた[Wantedly](https://www.wantedly.com/)のプロジェクトに参加することを想定していて、一部Railsのデフォルトでない機能の解説もありますが、使っているgemもメジャーなもので割と汎用的な内容になっていると思うので、是非参考にしてみてください。

## URLを見ればだいたいどこを変更すればいいかわかると言うこと


Ruby on RailsはMVC(Model View Controller)にもとづいて設計されていて、ディレクトリ構造的にも`app/`以下に綺麗に分かれている。


MVCって何？って人は、ググってみてほしいが、割と宗教論争になりかけているので、モデルはDBの各テーブルに関連していて、ビューはHTMLの部分に近くて、コントローラーはビュー用にモデルを引っ張ってくるつなぎ役だと思ってれば大体合っている。これ以上は深く考えずにコードを読んだほうが良いと思う。

### Router

でもコード的に本当に大事なのは、Routerと言われる部分で、`config/routes`に存在する。これは、URLとコントローラーを紐付けている部分で、設定の仕方は[Routing - RailsGuides](http://guides.rubyonrails.org/routing.html)参照。
設定結果は`rake routes`によって出力し確認できる。ただ、これいちいち打つのはめんどくさいので、定期的に結果を`config/routes`のファイル内下部に[annotate](https://github.com/ctran/annotate_models)している。


Routesを理解したら、app/以下にあるmodels, controllers, viewsをそれぞれ見てみれば良い。Railsでは何を複数形にして何を単数形にするかは割と大事なので間違えないように覚えて欲しい。Modelは単数でController, Viewの時は複数で書く。

### Model

ModelはActiveRecordというORマップなので、DBの知識があれば雰囲気で読めるはず。ちゃんと知りたければ[Active Record Basics - RailsGuides](http://guides.rubyonrails.org/active_record_basics.html)参照。

### Controller

Controllerを書く際、RailsはREST構造を大切にしているため、`index, show, new, edit, create, update, destroy`という7つのメソッドだけ特別な意味を持っている。これらのメソッドがそれぞれどんなURLに紐付けられるかは理解しておいて欲しい。
以下の表にCollection/Member, GET/POSTの2軸で分類しておいた。

|                            | Collection |  Memeber   |
|:--------------------------:|:---------:|:-----------:|
| **GET**                    | index new | show edit   |
| **POST(PUT/PATCH/DELETE)** | create | update destroy |

MemberはIDが必要でどのオブジェクトなのかが1つに定まるやつ。Collectionはそれ以外、具体的にはIndexページなど複数のオブジェクトを同時に表示するときと、新しくオブジェクトを作成するときに使う。

### View

GET、POSTは送られるリクエストでの分類だが、GETのもののみViewに存在するという事が大切。ただ、デフォルトで、`new.html`,`edit.html`は同じ`_form.html`というpartialを利用する実装になっているので、scaffoldされたviewには5つファイルが存在しているはず。

## Haml

http://haml.info/

```haml:sample.haml
.wrapper{ style: "margin: 0 20px" }
  %h1= post.title
  %h2 サブタイトル:#{post:subtitle}
  - post.images.each do |image|
    = image_tag image.url

:javascript
  alert("hello");
```

Htmlのテンプレートを書くとき、RailsでのデフォルトはERB(`.html.erb`)だがHAML(`.html.haml`)というのを使っている。([haml-rails](https://github.com/indirect/haml-rails))

こっちの方がいろいろ楽だが、中でも閉じタグ忘れがなくなるのがレビューもしやすくて良い。

これはCSSを知っていれば雰囲気で理解できると思う。
ただHaml内Javascript/CoffeeScriptの部分は割とややこしくなるので気をつけること。その時だけたまにerbを使ったりしている。

Viewに出てくる`form_for`, `link_to`などは、[Form Helpers - RailsGuides](http://guides.rubyonrails.org/form_helpers.html)参照。
[simple_form](https://github.com/plataformatec/simple_form) gemが定義している`simple_form_for`というのもたまに出てくるかもしれない。

## Coffee Script

http://coffeescript.org/

基本的にはRubyに慣れてきたら、RubyっぽいJavascriptだと思えば良くて、ちょっとわからなくなったら本家サイトの"TRY COFFEESCRIPT"のところでJavascriptに変換しながら書けばいい。

気をつけておくと良いかなというのは次の3点

- メソッドの引数がない場合でも最後の()は省略できない
- 3項演算子`<condition> ? <true-case> : <false-case>`は使えない。`if <condition> then <true-case> else <false-case>`を使う
- Hashの時Javascriptでの`for k, v in hash`は`for k, v of hash`になる。`in`じゃなくて`of`。`in`は配列の時に使う。


## デバッグの仕方とPry

http://pryrepl.org/

Rubyでは標準の対話式コンソールとしてirbというものが提供されているが、大抵のRubyプログラマは機能強化版のpryというものを使っている。とりあえず上の公式ドキュメントを見に行ってくるとVisualが多いので感覚がつかめると思う。

Railsのプロジェクトはどんなメソッドがあるか、メソッドがどこで定義されているかなどわかりにくいことも多いが、pryで対話的に調べることが可能。`cd`, `ls`, `?`あたりはマスターしとくこと。

特にプログラム中に埋め込める`binding.pry`がデバッグはもちろん、既存コードの動きを理解する際にとても役に立つ。

この`binding.pry`中にできる事一覧は`help`とうてば出てくるし、ググって予め調べとくのもいい気がする。


## Dashでリファレンス検索

Rubyのメソッドなのか、Railsのメソッドなのか、誰かが定義したメソッドなのかわからないことが多々ある。一つの解決法は上記のpryで定義場所を探ることだが、Macの人はRubyとRailsのメソッドを同時に検索できる[Dash](http://kapeli.com/dash)というツールを入れると良い。このDash先生、Ruby,Railsに限らず他のいろいろな言語の公式ドキュメントとAPIリファレンスをローカルで高速に検索して見れるようにしてくれる。ちなみに引っかからなかった時はGoogleから検索してくれるので、よくあるfind_by_XXXや、有名なgemが定義しているメソッドだった場合も気づくことができる。

ただ、お金払わないとたまに待ちぼうけを食らうのが難点。ちなみに自分はお金を払った。


## 必要ファイル一括生成: rails g

rails g(generate)という一気に必要なファイル群を生成するコマンド、特にscaffoldでどういうファイルができてくるか知っておくと良い。例えば、以下のものを打ってみて何が生成されるか見てみると良い。

```
rails g scaffold Blog user:references title content:text category_cd:integer
```

ちなみに`_cd`と言うのは、[simple_enum](https://github.com/lwe/simple_enum)のイディオムで決まった個数しかないカテゴリのようなものをDB的には数値で管理して、使用時にはstringとして扱う際によく利用している。

ちなみにrails gやった後に、中身を変更するのは結構めんどくさい。予め必要になるモデル構造を考えてからコーディングし始めることをオススメする。

ちなみに自分はscaffoldで作るときつかっているオプションはこれ:
http://qiita.com/awakia/items/d7d9b2ca006b51210ce9


## Railsサーバーを起動できない時に試してみるポイント

きちんと環境も揃っているのに、うまく起動できないは以下のをチェックしてみると良いかも。

- 環境変数は全て正しくセットされているか ([dotenv](https://github.com/bkeepers/dotenv)を使っているので`.env`を確認）
- DBなど必要な外部サービスは起動しているか
- `rake db:migrate`をして最新のDBスキーマになっているか
- `bundle install`をした後に`rails s`を再起動しているか
- 起動時に`bundle exec`をつけているか


この`bundle exec`はなくても大抵動くが、他のruby関係のプロジェクトで別のバージョンのgemが入ってたりするとよくわからないエラーが出たりするのでつけておいたほうがいい。