※この内容はRailsで書かれたWantedlyのプロジェクトに参加することを想定していて、一部Railsのデフォルトでない機能の解説もありますが、使っているgemもメジャーなもので割と汎用的な内容になっていると思うので、是非参考にしてみてください。
URLを見ればだいたいどこを変更すればいいかわかると言うこと
Ruby on RailsはMVC(Model View Controller)にもとづいて設計されていて、ディレクトリ構造的にもapp/
以下に綺麗に分かれている。
MVCって何?って人は、ググってみてほしいが、割と宗教論争になりかけているので、モデルはDBの各テーブルに関連していて、ビューはHTMLの部分に近くて、コントローラーはビュー用にモデルを引っ張ってくるつなぎ役だと思ってれば大体合っている。これ以上は深く考えずにコードを読んだほうが良いと思う。
Router
でもコード的に本当に大事なのは、Routerと言われる部分で、config/routes
に存在する。これは、URLとコントローラーを紐付けている部分で、設定の仕方はRouting - RailsGuides参照。
設定結果はrake routes
によって出力し確認できる。ただ、これいちいち打つのはめんどくさいので、定期的に結果をconfig/routes
のファイル内下部にannotateしている。
Routesを理解したら、app/以下にあるmodels, controllers, viewsをそれぞれ見てみれば良い。Railsでは何を複数形にして何を単数形にするかは割と大事なので間違えないように覚えて欲しい。Modelは単数でController, Viewの時は複数で書く。
Model
ModelはActiveRecordというORマップなので、DBの知識があれば雰囲気で読めるはず。ちゃんと知りたければActive Record Basics - RailsGuides参照。
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
.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)
こっちの方がいろいろ楽だが、中でも閉じタグ忘れがなくなるのがレビューもしやすくて良い。
これはCSSを知っていれば雰囲気で理解できると思う。
ただHaml内Javascript/CoffeeScriptの部分は割とややこしくなるので気をつけること。その時だけたまにerbを使ったりしている。
Viewに出てくるform_for
, link_to
などは、Form Helpers - RailsGuides参照。
simple_form gemが定義しているsimple_form_for
というのもたまに出てくるかもしれない。
Coffee Script
基本的には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
Rubyでは標準の対話式コンソールとしてirbというものが提供されているが、大抵のRubyプログラマは機能強化版のpryというものを使っている。とりあえず上の公式ドキュメントを見に行ってくるとVisualが多いので感覚がつかめると思う。
Railsのプロジェクトはどんなメソッドがあるか、メソッドがどこで定義されているかなどわかりにくいことも多いが、pryで対話的に調べることが可能。cd
, ls
, ?
あたりはマスターしとくこと。
特にプログラム中に埋め込めるbinding.pry
がデバッグはもちろん、既存コードの動きを理解する際にとても役に立つ。
このbinding.pry
中にできる事一覧はhelp
とうてば出てくるし、ググって予め調べとくのもいい気がする。
Dashでリファレンス検索
Rubyのメソッドなのか、Railsのメソッドなのか、誰かが定義したメソッドなのかわからないことが多々ある。一つの解決法は上記のpryで定義場所を探ることだが、Macの人はRubyとRailsのメソッドを同時に検索できる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のイディオムで決まった個数しかないカテゴリのようなものをDB的には数値で管理して、使用時にはstringとして扱う際によく利用している。
ちなみにrails gやった後に、中身を変更するのは結構めんどくさい。予め必要になるモデル構造を考えてからコーディングし始めることをオススメする。
ちなみに自分はscaffoldで作るときつかっているオプションはこれ:
http://qiita.com/awakia/items/d7d9b2ca006b51210ce9
Railsサーバーを起動できない時に試してみるポイント
きちんと環境も揃っているのに、うまく起動できないは以下のをチェックしてみると良いかも。
- 環境変数は全て正しくセットされているか (dotenvを使っているので
.env
を確認) - DBなど必要な外部サービスは起動しているか
-
rake db:migrate
をして最新のDBスキーマになっているか -
bundle install
をした後にrails s
を再起動しているか - 起動時に
bundle exec
をつけているか
このbundle exec
はなくても大抵動くが、他のruby関係のプロジェクトで別のバージョンのgemが入ってたりするとよくわからないエラーが出たりするのでつけておいたほうがいい。