Railsとは
Railsとは、Rubyプログラミング言語で書かれたWebアプリケーションフレームワーク(MVC)です。 Railsは、あらゆる開発者がWebアプリケーションの開発を始めるうえで必要となる作業やリソースを事前に仮定して準備しておくことで、Webアプリケーションをより簡単にプログラミングできるように設計されています。
① Railsをインストール(MAC OS)
-
Homebrewをインストールする
Homebrewとは「ユーザが自らパッケージをビルドして使用する」、これをインストールするためには、Command Line Tools for Xcodeを先にインストールする必要があります
ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
-
Rubyをインストールする
デフォルトで入っているrubyより、最新のrubyをインストールして使用します。そのために、rbenvというツールをインストールします。
-
rbenvをインストール
rbenvとは、rubyのバージョンを管理してくれるツールです
$ brew update
$ brew install rbenv ruby-build
$ echo ‘eval “$(rbenv init -)”‘ >> ~/.bash_profile
$ source ~/.bash_profile
-
Rubyをインストール
$ rbenv install -l # 2.0.0-pXXXを探してください
$ rbenv install 2.0.0-pXXX # 上で探した2.0.0-pXXXを入力
$ rbenv global 2.0.0-pXXX # 上で指定した2.0.0-pXXXを入力
$ ruby -v # 2.0.0-pXXXが表示されることを確認
-
MySQLをインストール
$ brew install mysql
-
Railsアプリの作成準備
必要最低限なgemをインストールします。それ以外は、Bundlerで管理することになるはずです。
$ gem install bundler
$ gem install rails
$ rbenv rehash
ここまで来たらrails newコマンドでrailsアプリを作成していけます。
-
Railsプロジェクトを作成
rails new myapp
rails new myapp -d mysql(MySqlを使います)
cd myapp
rake db:create (データベースを作ります)
rails s(Railsサーバーを起動します)
myappのウェブサイト: http://localhost:3000
② MVCに基づく設計
後述しますが、モデルやコントローラのひな形を自動生成してくれる便利なコマンドがあります。
基本的な処理はそのコマンドから初めて、必要な箇所だけあとから編集、というのがおおまかな処理の流れになると思います。
③ RailsのMVC
-
Model
app/models に配置されます。
Modelは ActiveRecord::Base クラスを継承したものになります。
基本的な CRUD (Create, Read, Update, Delete) の仕組みはベースクラスで定義されているため、特殊な処理がないモデルの場合は以下のように定義するだけで基本的な機能を使うことができます。
コメントで指摘もらいましたが、あくまでその処理を行うことが定義されている、という意味です。
なので実際にアプリケーションとして実行可能な状態にするにはコントローラなどとの連携が必要になります。
Modelで使用される型
型 |
概要 |
string |
文字列 |
text |
長い文字列 |
integer |
整数 |
float |
浮動小数点数 |
decimal |
精度の高い小数 |
datetime |
日時 |
timestamp |
タイムスタンプ |
time |
時刻 |
date |
日付 |
binary |
バイナリ |
boolean |
真理値 |
primary_key |
主キー |
-
Controller
app/controllers に配置されます。
ユーザからの操作を受け付けて、アプリケーションの動作を決定するコントローラです。
プロジェクトディレクトリの下に config ディレクトリがあります。
その中の routes.rb ファイルにルートをに関する設定をしてあげると自動的にそのルーティングを行う処理を実行してくれます。
Rails.application.routes.draw do
resources :projects
end
サイトトップにアクセスしたときなどに、どこを表示して欲しいかをコントローラとアクションの単位で指定しておくことができます。
例:root ‘projects#index’
上記のようにすると、トップに来た場合に projects の index アクションが実行されます。
以下のようにすることで、あるモデル以下に紐付いた他モデルのデータ(has many的な)を表示、というようなURLのルーティングを実現することができます。
(いわゆるhas manyの関係にあるデータの表示とか)
resources :projects do
resources :tasks, only: [:create, :destroy]
end
こうすることで、とあるプロジェクトに紐付いたタスク一覧を表示するURLを設定することができます。
このURLにアクセスしたらこのアクションを実行したい、という場合は以下のようにすることで設定することができます。
post ‘/projects/:project_id/tasks/:id/toggle’ => ‘tasks#toggle’
tasks はコントローラです。そのコントローラの toggle メソッド(アクション)を実行する設定です。
ルーティングの設定ができたら rake routes コマンドでルーティングを確認することができます。
-
before_action, after_action
モデルの取得など、各アクションの中で共通に処理する部分があるかと思います。
その際に、同じことを書くのはDRYに反するので、before_action や after_action に処理をまとめることで共通化することができます。
具体的には以下のようにします。
controller:
class ProjectsController < ApplicationController
before_action :anyMethod, only: [:show, :edit]
private
def anyMethod
# do common action
end
end
ちなみにこの before_action という記述はRubyの機能で、クラス・メソッドなどを指定するとそれがクラス宣言時に実行されるようになります。
※ コメントで指摘をもらったので補足しておきます。before_action というメソッド自体はRails側の機能です。ただ、クラス宣言時に実行される、という点がRubyの機能という意味です。
モデルを操作するコントローラを作成する場合は同様に、モデル名の複数形で作成する必要があります。上記の例で言えば Projects。
さらに、上記のルーティングで示されている Controller#Action の項目が、コントローラにどのメソッドを実装したらどのアクションが実行されるかを表しています。
例えば、index メソッドを実装すれば /projects(.:format) にアクセスされたときにそれが実行されます。
-
View
app/views に配置されます。
HTMLをレンダリングし表示するビュー。
ちなみに ERB(Embed RuByの略) を利用してHTMLを構築します。
<% if (hoge) %>
ここにHTML
<% end %>
<%= hoge.name %>
<% ~ %> と <%= ~ %> という記述方法がある。
前者はRubyを実行するだけで返り値は無視されますが、後者は戻り値がそのままHTMLとして出力される点が異なります。
パーシャルを使う
DRY(Don’t repeat your self)の精神で、同じことを記述することを避けるのがRails風です。
ということで、Viewの中で同じ記述が現れる箇所がある場合は、「パーシャル」という機能を使ってまとめておくと便利です。
パーシャルの使い方にもルールがあり、以下のように記述します。
<%= render ‘hoge’ %>
上記は erb ファイルの一部です。上記のように render メソッドを使ってパーシャルを呼び出します。
パーシャル自体は、Viewsの中に、renderの引数に渡された文字列にアンダースコアを付けたファイル(上記の例では _hoge.erb)を作成し、そこに共通項目を書きます。
あとはRailsが規約に則って該当のパーシャルのその位置に読み込んでくれます。
Viewに関する規約
Viewに関する規約は、コントローラのアクション名と同名のファイル名にする、という点です。
(例えば index アクションなら index.html.erb ファイル)
共通テンプレート
Viewはまた、共通テンプレートを持つことができます。HTML内のhead要素などサイト内で共通にしておきたいものはたくさんあると思います。
それらについては app/views/layouts ディレクトリ内に配置されます。
また、各Viewに記述された内容はテンプレート内の <%= yield %> に展開されるようになっています。
④ Railsのコマンド
よく使うコマンドだけメモします。参考:http://railsdoc.com/rails
-
Scaffold: 全部入り
$ rails generate scaffold NAME [field[:type][:index] field[:type][:index]] [options]
NAME |
モデル名 (単数系)。under_score記法とCamelCased記法どちらでもよい |
field |
カラム名 |
type |
型 |
index |
インデックス(uniqueかindex) |
options |
オプション |
例: $ rails generate scaffold AdminUser name:string mail:string
-
Scaffold_controller
コントローラとビューをデフォルトのアクション(index〜destroyの計7つ)で生成する
$ rails generate scaffold_controller NAME [options]
NAME |
モデル名(単数系)。under_score記法とCamelCased記法どちらでもよい。 |
options |
オプション |
例: $ rails generate scaffold_controller AdminUser
-
Controller: コントローラとビューを生成する
$ rails generate controller NAME [action action] [options]
NAME |
コントローラ名(単数系か複数系かは用途に合わせて )。under_score記法とCamelCased記法どちらでもよい |
action |
アクション |
options |
オプション |
例: $ rails generate controller AdminUsers index show
-
Model:モデルとマイグレーションを生成する
$ rails generate model NAME [field[:type][:index] field[:type][:index]] [options]
NAME |
モデル名 (単数系)。under_score記法とCamelCased記法どちらでもよい |
field |
カラム名 |
type |
型 |
index |
インデックス(uniqueかindex) |
options |
オプション |
例:$ rails generate model AdminUser name:string mail:string
-
Migration:マイグレーションを生成する
$ rails g migration NAME [field[:type][:index] field[:type][:index]] [options]
NAME |
マイグレーション名 |
field |
カラム名 |
type |
型 |
index |
インデックス(uniqueかindex) |
options |
オプション |
例:$ rails generate migration AddGroupIdToAdminUsers group_id:integer
-
マイグレーション実行
$ rake db:migrate
⑤ 命名の慣習
-
大文字小文字
RubyとRailsの慣習を以下に示します。
- クラス名: アッパーキャメルケースで表記します。例: MyClass
- メソッド名: スネークケースで表記します。例: update_attribute
- 変数名: スネークケースで表記します。例: @user_name
(参考:キャメルケースとスネークケース)
-
メソッド名の選定
メソッド名の命名に使う語彙にも慣習があります。
- プロパティ的なメソッドには動詞を含めず、名詞のみで。
- ○: def width
- ○: def width=(val)
- ×: def get_width
- ×: def get_width=(val)
.get_widthとしなくても.widthだけで十分意味が通じるという考え方です。
以下はよく知られた慣習だと思います。
- true/falseを返すメソッド名の末尾には?を付けます。例: valid?
- メソッド名から推測されるよりも破壊的なメソッドの末尾には!を付けます。例: save!
前者は意味を限定して明確にし、後者は使用上の注意が必要であることを知らせます。
-
コントローラ名とモデル名
Railsでは、コントローラ名は英語の複数形で終わり、モデル名は英語の単数形で終わることが前提となっています。また、コントローラ名とモデル名が互いに関連する場合には原則として一貫した命名をする慣習があります。
たとえば、ユーザープロファイルを扱うコントローラとモデルを作成する場合、コントローラ名はUserProfiles、モデル名はUserProfileとします。
1.#コントローラ
class UserProfiles < ApplicationController
end
2.#モデル
class UserProfile < ActiveRecord::Base
end
コントローラ名とモデル名はどちらもクラス名なのでキャメルケースで表記しますが、それぞれが保存されるファイルの名前はスネークケースで記述しますので注意してください。
- コントローラ名: user_profiles_controller.rb
- モデル名: user_profile.rb
なお、モデルと関連付けられるデータベースのテーブル名は「複数形かつスネークケース」となります。
⑥ デバッグ
1. ビューファイルのデバッグ
ビュー内では、次のようにdebugメソッドを使うことで、変数の値や、パラメーターの値を表示することができます。
# ビューファイル
<!– develompent環境のときにデバッグ情報を表示する –>
<%= debug if Rails.env.development? %>
<!– インスタンス変数(@products)の値を表示する –>
<%= debug @products %>
<!– paramsの内容を画面に表示する。–>
<%= debug params %>
<!– 他にも、session、headers、params、flash、request、responseなどの値も表示できます –>
2. モデルとコントローラーでのデバッグ
モデルとコントローラーではビューと違って画面表示がないので、logger.debugメソッドを使い、ログファイルに情報を出力します。
# コントローラーかモデル
logger.debug “出力したいデバッグ情報”
ブレイクポイントを設定した本格的なデバッグ
まず、pry-byebugというデバッグを実行できるようにするGemを追加します。
# Gemfile
group :development, :test do
gem ‘pry-rails’ # rails console(もしくは、rails c)でirbの代わりにpryを使われる
gem ‘pry-doc’ # methodを表示
gem ‘pry-byebug’ # デバッグを実施(Ruby 2.0以降で動作する)
gem ‘pry-stack_explorer’ # スタックをたどれる
end
Bundlerでインストールします。
bundle install
あとは、ビュー、コントローラー、モデルなど詳細にデバッグを行いたい箇所にbinding.pryと記載するとそこがブレイクポイントになります。
あとは、実際にそこの箇所になれば、サーバーが停止し、interactiveなモードになります。
例:
<p>
<strong>Username:</strong>
<%= @user.username %>
=> <% binding.pry %>
</p>
<p>
<strong>Email:</strong>
<%= @user.email %>
</p>
そこで、変数の内容を表示したり、変数定義やコマンドを試すことができます。
また、次の4つのコマンドでソース内を移動できます。
next # 次の行に移動する
step # 次の行か、メソッド内の行に移動する
exit # 次のブレークポイントまで実行する
finish # 現在のスタックトレース(画面に表示されているメソッド)が終わるまで実行する
参考:http://guides.rubyonrails.org/debugging_rails_applications.html
⑦ GEM
Rubyのサードパーティ製のライブラリの形式のこと
すべてのRailsプロジェクトでいれておくべき7つの開発用Gem(参考:
http://qiita.com/icb54615/items/374f76b38f673fab7744)
Gemを検索サイト:https://rubygems.org/