Rails まとめる!

Railsとは

Railsとは、Rubyプログラミング言語で書かれたWebアプリケーションフレームワーク(MVC)です。 Railsは、あらゆる開発者がWebアプリケーションの開発を始めるうえで必要となる作業やリソースを事前に仮定して準備しておくことで、Webアプリケーションをより簡単にプログラミングできるように設計されています。

 

① Railsをインストール(MAC OS)

  1. Homebrewをインストールする

Homebrewとは「ユーザが自らパッケージをビルドして使用する」、これをインストールするためには、Command Line Tools for Xcodeを先にインストールする必要があります

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

 

  1. Rubyをインストールする

デフォルトで入っているrubyより、最新のrubyをインストールして使用します。そのために、rbenvというツールをインストールします。

  1. rbenvをインストール

rbenvとは、rubyのバージョンを管理してくれるツールです

$ brew update
$ brew install rbenv ruby-build
$ echo ‘eval “$(rbenv init -)”‘ >> ~/.bash_profile
$ source ~/.bash_profile

  1. 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が表示されることを確認

 

  1. MySQLをインストール

$ brew install mysql

  1. Railsアプリの作成準備

必要最低限なgemをインストールします。それ以外は、Bundlerで管理することになるはずです。

$ gem install bundler
$ gem install rails
$ rbenv rehash

ここまで来たらrails newコマンドでrailsアプリを作成していけます。

 

  1. 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

  1. 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 主キー

 

  1. Controller

 

app/controllers に配置されます。

ユーザからの操作を受け付けて、アプリケーションの動作を決定するコントローラです。

  • ルーティングを設定する

プロジェクトディレクトリの下に config ディレクトリがあります。

その中の routes.rb ファイルにルートをに関する設定をしてあげると自動的にそのルーティングを行う処理を実行してくれます。

Rails.application.routes.draw do
   resources :projects

end

  • rootを設定する

サイトトップにアクセスしたときなどに、どこを表示して欲しいかをコントローラとアクションの単位で指定しておくことができます。

例:root ‘projects#index’

上記のようにすると、トップに来た場合に projects の index アクションが実行されます。

  • URLの階層を定義する

以下のようにすることで、あるモデル以下に紐付いた他モデルのデータ(has many的な)を表示、というようなURLのルーティングを実現することができます。

(いわゆるhas manyの関係にあるデータの表示とか)

resources :projects do
   resources :tasks, only: [:create, :destroy]
end

こうすることで、とあるプロジェクトに紐付いたタスク一覧を表示するURLを設定することができます。

  • 特定URLをアクションに結びつける

このURLにアクセスしたらこのアクションを実行したい、という場合は以下のようにすることで設定することができます。

post ‘/projects/:project_id/tasks/:id/toggle’ => ‘tasks#toggle’

tasks はコントローラです。そのコントローラの toggle メソッド(アクション)を実行する設定です。

  • Controllerのルーティングを確認する

ルーティングの設定ができたら 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の機能という意味です。

  • Controllerに関する規約

モデルを操作するコントローラを作成する場合は同様に、モデル名の複数形で作成する必要があります。上記の例で言えば Projects。

さらに、上記のルーティングで示されている Controller#Action の項目が、コントローラにどのメソッドを実装したらどのアクションが実行されるかを表しています。

例えば、index メソッドを実装すれば /projects(.:format) にアクセスされたときにそれが実行されます。

 

  1. 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

  1. 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

  1. Scaffold_controller

コントローラとビューをデフォルトのアクション(index〜destroyの計7つ)で生成する

$ rails generate scaffold_controller NAME [options]

 

NAME モデル名(単数系)。under_score記法とCamelCased記法どちらでもよい。
options オプション

 

例: $ rails generate scaffold_controller AdminUser

  1. Controller: コントローラとビューを生成する

$ rails generate controller NAME [action action] [options]

 

NAME コントローラ名(単数系か複数系かは用途に合わせて )。under_score記法とCamelCased記法どちらでもよい
action アクション
options オプション

 

例: $ rails generate controller AdminUsers index show

 

  1. 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

  1. 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

  1. マイグレーション実行

$ rake db:migrate


⑤ 命名の慣習

  1. 大文字小文字

RubyとRailsの慣習を以下に示します。

  • クラス名: アッパーキャメルケースで表記します。例: MyClass
  • メソッド名: スネークケースで表記します。例: update_attribute
  • 変数名: スネークケースで表記します。例: @user_name

(参考:キャメルケースとスネークケース

 

  1. メソッド名の選定

メソッド名の命名に使う語彙にも慣習があります。

  • プロパティ的なメソッドには動詞を含めず、名詞のみで。
    • ○: def width
    • ○: def width=(val)
    • ×: def get_width
    • ×: def get_width=(val)

.get_widthとしなくても.widthだけで十分意味が通じるという考え方です。

以下はよく知られた慣習だと思います。

  • true/falseを返すメソッド名の末尾には?を付けます。例: valid?
  • メソッド名から推測されるよりも破壊的なメソッドの末尾には!を付けます。例: save!

前者は意味を限定して明確にし、後者は使用上の注意が必要であることを知らせます。

  1. コントローラ名とモデル名

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のサードパーティ製のライブラリの形式のこと

  • 7つの開発用Gem

すべてのRailsプロジェクトでいれておくべき7つの開発用Gem(参考:

http://qiita.com/icb54615/items/374f76b38f673fab7744

Gemを検索サイト:https://rubygems.org/

2 thoughts on “Rails まとめる!

  1. oh, i’m sorry.
    Thank for yours care. I’ll continue to write on this day!
    Also, something about me, I love programing, and love ruby on rails!
    You are programmer? and what do you want me to write about?

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s