読者です 読者をやめる 読者になる 読者になる

ぺーぺーSEのブログ

備忘録・メモ用サイト。

Spring MVC入門

Java SpringMVC Maven Spring

Spring MVCで最小アプリケーションが動くまでの設定についてまとめる。
以下の2種類で同じアプリを実装する。

  • Java Based Configuration
  • XML Based Configuration

上記は両方HTTP GETするとHelloが返ってくる簡単たRESTアプリ。
Spring BOM 2.0.8.RELEASEで動確した。

Java Based Configuration

以下を作成する。

  • pom.xml
  • src/main/java/com/pepese/sample/config/AppConfig.java
    • Spring設定クラス
      • DIやAOPなどの設定に使用する
    • @Configuration アノテーションを付与すること
    • 必要に応じて@ComponentScanを指定してコンポーネントスキャン領域を指定すること
  • src/main/java/com/pepese/sample/config/WebMvcConfig.java
    • Spring MVC設定クラス
      • コンテンツネゴシエーションなどSpring MVCのDispatcherServletに関する設定に使用する
    • WebMvcConfigurerAdapter が継承されていること
    • @Configuration アノテーションを付与すること
    • @EnableWebMvc アノテーションを付与すること
  • src/main/java/com/pepese/sample/config/WebInitializer.java
    • web.xmlのJava Based Configuration
    • AbstractAnnotationConfigDispatcherServletInitializerを継承すること
      • WebApplicationInitializerの実装クラス
  • src/main/java/com/pepese/sample/controller/HelloController.java
    • 動作確認用のコントローラクラス
  • src/main/java/com/pepese/sample/service/HelloService.java
    • DIなどの動作確認用のサービスクラス

pom.xml

AppConfig.java

WebMvcConfig.java

WebInitializer.java

HelloController.java

HelloService.java

mvn clean package してTomcatにデプロイすれば動く。

XML Based Configuration

以下を作成する。Java Based Configurationと異なるファイルだけ記載する。
以下は不要になるファイル。

  • src/main/java/com/pepese/sample/config/AppConfig.java
  • src/main/java/com/pepese/sample/config/WebMvcConfig.java
  • src/main/java/com/pepese/sample/config/WebInitializer.java

以下は追加するファイル。

  • src/main/resources/META-INF/spring/applicationContext.xml
  • src/main/resources/META-INF/spring/spring-mvc.xml
  • src/main/webapp/WEB-INF/web.xml

applicationContext.xml

spring-mvc.xml

web.xml

mvn clean package してTomcatにデプロイすれば動く。

Spring Boot入門

Java SpringBoot Maven Spring

Spring Bootで最小アプリケーションが動くまでの設定についてまとめる。
以下の2種類について記載する。

  • Spring Bootで実行可能jarの作成
  • Spring BootでAPサーバにデプロイ可能なwarの作成

上記は両方HTTP GETするとHelloが返ってくる簡単たRESTアプリ。

Spring Bootで実行可能jarの作成

以下を作成する。

  • pom.xml
    • Maven設定ファイル/POM
    • POMのdependencyに spring-boot-starter-* が含まれること
    • POMのbuild -> pluginsに spring-boot-maven-plugin が含まれること
      • mvn package 実行時に適切に実行可能jarを作成してくれる
  • src/main/java/com/pepese/sample/Application.java
    • Spring Bootアプリケーション起動クラス
    • @SpringBootApplication アノテーションを付与すること
      • @Configuration@EnableAutoConfiguration@ComponentScan をまとめたもの
  • src/main/java/com/pepese/sample/config/AppConfig.java
    • Spring設定クラス
      • DIやAOPなどの設定に使用する
    • @Configuration アノテーションを付与すること
  • src/main/java/com/pepese/sample/config/WebMvcConfig.java
    • Spring MVC設定クラス
      • コンテンツネゴシエーションなどSpring MVCのDispatcherServletに関する設定に使用する
    • WebMvcConfigurerAdapter が継承されていること
    • @Configuration アノテーションを付与すること
    • Spring Bootの場合、 @EnableWebMvc を付与する必要はない
      • Spring Bootを利用しないSpring MVCアプリケーションを作成する場合には付与する
  • src/main/java/com/pepese/sample/controller/HelloController.java
    • 動作確認用のコントローラクラス
  • src/main/java/com/pepese/sample/service/HelloService.java
    • DIなどの動作確認用のサービスクラス

pom.xml

Application.java

AppConfig.java

WebMvcConfig.java

HelloController.java

HelloService.java

実行

以下の2通り。

  • mvn spring-boot:runで実行してhttp://localhost:8080/へアクセス
  • mvn packageでビルドしてjava -jar target/springboot-sample-jar-0.0.1-SNAPSHOT.jarで実行してhttp://localhost:8080/へアクセス

Spring BootでAPサーバにデプロイ可能なwarの作成

意味あんの?なツッコミは無しで。
準備されたTomcatにデプロイしないといけないルールなプロジェクトは存在するんです。
以下を作成する。「Spring Bootで実行可能jarの作成」と異なるファイルだけ記載する。

  • pom.xml (変更)
    • Maven設定ファイル/POM
    • POMのdependencyに spring-boot-starter-* が含まれること
    • POMのbuild -> pluginsに spring-boot-maven-plugin が含まれること
      • mvn package 実行時に適切にデプロイ可能warを作成してくれる
    • POMのpackagingをwarにすること
    • POMのspring-boot-starter-tomcatの組み込み系APサーバのscopeをprovidedにすること
      • tomcatに限らずjetty等組み込み系APサーバは全て
  • src/main/java/com/pepese/sample/ServletInitializer.java (追加)
    • web.xmlのSpring Boot版
    • SpringBootServletInitializerが継承されていること
      • web.xmlのSpring MVC版である WebApplicationInitializer を継承している
    • configure メソッドをオーバーライドし、Spring Bootアプリケーション起動クラスをロードすること

pom.xml

ServletInitializer.java

実行

以下の2通り。

  • mvn spring-boot:runで実行してhttp://localhost:8080/へアクセス
  • mvn packageでビルドしてできたwarをTomcatにデプロイしてhttp://localhost:8080/springboot-sample-war/へアクセス
    • コンテキストパスは自分で調整して

補足

SpringBootServletInitializer はSpring Bootの起動クラスに継承して作成してもよい。下記の通り。

package com.pepese.sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

Homebrew入門

Mac Homebrew

Homebrewについてまとめる。
HomebrewはMac用のaptやyumのようなパッケージマネージャ。ソフトウェアを簡単にインストールできる。

インストール

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

上記を実行後、brew doctorで問題がないことを確認。
もしWarningが出たらメッセージに従って対処する。
筆者の場合はXcodeをインストールしてCommand Line Toolsをアップデートしたら解決した。
変更があるかもしれないので公式を確認のこと。

  • /usr/local/Cellar/
    • Homebrewでインストールしたソフトウェアはここに配備される
  • /usr/local/bin/
    • インストールしたソフトウェアのコマンドのシンボリックリンクはここに配備される

brew tap

brew tap は、公式以外の formula を追加することのできる Homebrew のサブコマンド。
Homebrewをインストールした際に標準で組み込まれている。

$ brew tap <userName>/<repository>

上記コマンドを実行すると、GitHub 公開リポジトリ (https://github.com//homebrew-) が参照され、/usr/local/Library/Taps以下にインストールされる。
brew tapコマンドでこれまでにインストールされたソフトウェアの一覧が見れる。
また、brew tap <url>コマンドでGitHub以外のソフトウェアもインストール可能。

brew cask

brewやbrew tapでソフトウェアをインストールする際、目的のソフトウェアを動かすには依存するその他のソフトウェアをインストールする必要がある場合がある。
そんなときbrew caskを使用すると目的のソフトウェアをインストールするだけで依存するソフトウェアもインストールしてくれる。
さらにGoogle ChromeやAtomといったソフトのインストールも可能となる。

インストール

brew tapでインストールする。

$ brew tap caskroom/cask

caskで扱えるソフトウェアのバージョンを増やすために下記も導入しておく。

$ brew tap caskroom/versions

変更があるかもしれないのでcask公式versions公式を参照。

使い方

$ brew cask search <software>
$ brew cask install <software>
$ brew cask uninstall <software>

その他のコマンドはここ

Spring MVCでJUnitテスト

Java Spring JUnit Maven SpringBoot

Spring MVCのテストについて書く。
spring-testを使用するとコントローラのJUnitテストも可能になる。
テストやコードインスペクションレポートのMaven設定は以下を参照。

blog.pepese.com

テスト対象アプリ

以下の記事で紹介した入門アプリをテスト対象とする。

blog.pepese.com

テストの作成

以下を作成する。

  • com.pepese.sample.service.HelloServiceTest
    • コントローラへDIされるサービスクラスのテスト
  • com.pepese.sample.controller.HelloControllerTest
    • コントローラのテスト

サービスのテスト(com.pepese.sample.service.HelloServiceTest)

ポイントは以下。

  • @RunWith(SpringJUnit4ClassRunner.class) アノテーション
    • SpringでJUnitテストするときはコレをつける
  • @ContextConfiguration アノテーション
    • SpringのJava/XML Based Configurationを指定する
    • @ContextConfiguration(classes = {AppConfig.class, WebMvcConfig.class})
    • @ContextConfiguration(locations = { "file:src/main/resources/META-INF/spring/spring-mvc.xml" })
  • @WebAppConfiguration アノテーション
    • Webアプリケーションのテストの際に付与する

Springの設定(Java/XML Based Configuration)を読み込んでいるのでDIでテスト対象のインスタンスを取得できる。

コントローラのテスト(com.pepese.sample.controller.HelloControllerTest)

ポイントは以下。

  • テスト対象となるコントローラクラスを指定して、コントローラのモック( MockMvc )を作成できる
  • モック(Mockito)を使用するためにルール(@Rule)を宣言する
  • @Mock でモックオブジェクトがDIされる
  • when メソッド等(Mockito)を使用してコントローラ内にDIされたモジュールの挙動を指定できる
  • HamcrestのMatchersを使用してassertする

テストの実行

基本的には mvn test で実行可能だが、特定のクラスを指定してテストしたい場合は mvn clean test -Dtest=*.HelloControllerTest のように指定して実行できる(正規表現の指定可能)。
また、 mvn clean test -Dtest=*.HelloControllerTest,*HelloServiceTest のようにカンマ区切りで複数指定することもできる。

参考

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

Macで開発環境を作る

Mac Homebrew anyenv Ruby Node.js Python Perl Java STS Maven

OSの設定

Dockの大きさを調整する

  • 「りんごマーク」->「システム環境設定」->「Dock」
    • ここで好きなように設定(サイズは最小、拡大をチェックして最大、がオススメ)

トラックパッドの設定

  • 「りんごマーク」->「システム環境設定」->「トラックパッド」
    • ここで好きなように設定(「タップでクリック」を選択)

ドラッグ&ドロップの設定

  • 「りんごマーク」->「システム環境設定」->「アクセシビリティ」->「マウスとトラックパッド」を選択
  • 「トラックパッドオプション」-> 「ドラッグを有効にする」->「ドラッグロックあり」

これで2タップ目でちょっと動かしたらファイル・ウィンドウをホールドでき、もう1タップしたリリースできる。

デスクトップの整理

  • デスクトップで右クリック(二本指クリック)->「表示順序」->「名前」を選択

ライブ変換オフ

タイピング中に勝手に変換される、あれ。
http://sbapp.net/appnews/osxelcapitan-33422

Finderで隠しファイルを表示

$ defaults write com.apple.finder AppleShowAllFiles TRUE
$ killall Finder

開発環境作成

Homebrewをインスール

以下を参照。

blog.pepese.com

iTerm2をインストール

$ brew cask search iterm2
==> Exact match
iterm2
$ brew cask install iterm2
==> Moving App 'iTerm.app' to '/Applications/iTerm.app'

Macデフォルトのターミナルより便利。
Command + Dでウィンドウ分割できたりする。

cURLをインストール

  • ターミナルでbrew install curl
  • brew listでcURLが含まれているか確認

Gitをインストール

  • ターミナルでbrew install git
  • brew listでgitが含まれているか確認
  • git --versionで確認

Gitの使い方は以下。

blog.pepese.com

anyenvをインストール

  • 公式を参照
  • スクリプト系プログラミング言語のインストール・バージョン管理ができるようになる
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l

Rubyをインストール

$ anyenv install rbenv
$ git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.anyenv/envs/rbenv/plugins/rbenv-gem-rehash
$ exec $SHELL -l
$ rbenv install 2.3.0
$ rbenv global 2.3.0
$ ruby -v

「rbenv-gem-rehash」を導入することで「rbenv rehash」(~/.rbenv/versions/2.x.y/bin/ 以下に置いてあるコマンド群を ~/.rbenv/shims/以下に置いて使えるようにする)を実行する必要が無くなる。

ついでいgemの確認とbundlerの導入。

$ which gem
/Users/xxx/.anyenv/envs/rbenv/shims/gem
$ gem install bunlder
$ which bundle
/Users/xxx/.anyenv/envs/rbenv/shims/bundle

node.jsをインストール

$ anyenv install ndenv
$ ndenv install v4.2.5
$ exec $SHELL -l
$ ndenv shell v4.2.5
$ npm update -g npm
$ ndenv shell --unset
$ ndenv global v4.2.5

その他スクリプト言語をインストール(**env)

$ anyenv install plenv
$ anyenv install pyenv
$ plenv install 5.25.7
$ pyenv install 3.5.2
$ plenv global 5.25.7
$ pyenv global 3.5.2
$ plenv rehash
$ pyenv rehash
$ anyenv varsions

Oracle Javaをインストール

$ brew cask install java

インストールされたJavaの確認は以下。

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    1.8.0_112, x86_64: "Java SE 8"  /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
    1.8.0_111, x86_64: "Java SE 8"  /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

PATHが通ってなかったら~/.bash_profileに以下を加筆してsource ~/.bash_profile

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

1.8の部分を1.7にするとJava7を使用できる。
消す時は以下。

$ rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home

Mavenをインストール

$ brew search maven
maven                                    maven-shell
homebrew/completions/maven-completion    homebrew/versions/maven32
homebrew/versions/maven31                Caskroom/cask/mavensmate
$ brew install homebrew/versions/maven32
$ mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T02:29:23+09:00)
Maven home: /usr/local/Cellar/maven32/3.2.5/libexec
Java version: 1.8.0_112, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.2", arch: "x86_64", family: "mac"

エディタ・IDEの設定

Atom

blog.pepese.com

STS (Spring Tool Suite)

$ brew cask install sts

その他ツール

FileZilla

FTP、FTPS、SFTPのGUIクライアント。

$ brew cask install filezilla

Atomのインストールとパッケージの導入

Atom エディタ

インストール(Mac)

  • 公式へアクセス
  • 「Download For Mac」をクリック
  • ダウンロードした ファイルがzipであれば解凍する
  • Macアプリ「Atom」が表示されるので、それを「アプリケーション」フォルダへドラッグ&ドロップ
  • 「アプリケーション」フォルダへ移動し、「Atom」を起動

brew caskが使える人は以下でもよい。

$ brew cask install atom

上記がなんのことかわからない人は以下参照。

blog.pepese.com

起動方法

アイコンクリックでもいいがコマンドラインで起動できる。

$ atom file

プロジェクト(カレントディレクトリ)で起動したい場合は以下。

$ atom .

パッケージ導入方法

  • メニュータブの「Packages」->「Settings View」を選ぶと「Settings」タブが開く
    • 「Ctrl+,」(Win)、「Command+,」(Mac)でも開く
  • 「Install」メニューを選択し、欲しいパッケージを検索して「Install」ボタンを押すS
  • 設定が反映されない場合はAtomを再起動する

オススメのパッケージ

  • japanese-menu
    • メニューバーとコンテキストメニューを日本語化
  • japanese-wrap
    • 日本語を折り返してくれるパッケージ
    • 現在のAtomは日本語の折り返しがうまく機能しないため
  • goto-defitinion
    • 「Ctrl+Alt+Enter」(Win)、「Option+Cmd+Enter」(Mac)でクラス、メソッドの実装へ飛べるようになる
  • terminal-plus( platformio-ide-terminal
    • ターミナル画面を追加できるパッケージ
      • 画面を切り替えてターミナル開くのが面倒になった人にオススメ
    • 下部の「+」をクリックするか、 Ctrl + Shift + @ でターミナルが開く
    • しかしながら、2017/01/19時点では動かなかったため、terminal-plusをforkして作成された platformio-ide-terminal がいい

Ruby on Rails入門

Rails Ruby

サンプルアプリを作りながらRuby on Railsの全体像を把握する。
実行環境構築は以下を参照。

blog.pepese.com

また、ここでの実行環境は以下。

> ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]

> rails -v
Rails 5.0.0.1

Ruby on Railsアプリケーションの作成

Ruby on Railsではrailsコマンドを使って設定ファイルやソースを半自動生成しながら開発する。
アプリケーションの作成には「rails new」コマンドを使用する。

rails newコマンド

rails new [アプリ名] [options]

rails newコマンドのオプション(rails new --helpで詳細出る)

オプション 説明 デフォルト
-r, -ruby=PATH ruby実行ファイルまでのパス
-m, -template=TAMPLATE アプリケーションテンプレートのパス
-d, --database=DATABASE データベースの種類 sqlite3
-j, --javascript=JAVASCRIPT 組み込むJavaScriptライブラリーを指定。 jquery
--skip-gemfile Grmfileを作成しない 作成する
ーB, --skip-bundle bundle installを行わない installする
-G, --skip-git .gitignoreを作成しない 作成する
--skip-keeps .keepを作成しない 作成する
-M, --skip-action-mailer Active Mailerを作成しない 作成する
-O, --skip-active-recode Active Recordを作成しない 作成する
-P, --skip-puma Pumaを関連付けない する
-C, --skip-action-cable Action Cableを作成しない 作成する
-S, --skip-sprockets Sprocketsを作成しない 作成する
--skip-spring springアプリケーションをインストールしない
--skip-listen listen gemに依存した設定を作成しない
-J, --skip-javascript javascriptを組み込まない
--skip-turbolinks turbolinks gemをスキップする
-T, --skip-test-unit test::unitを組み込まない
--dev github リポジトリ上の自分のコードから作成
--edge github リポジトリ上の最新のコードから作成
--rc=RC Railsコマンドのオプションファイルを指定
--no-rc .railsrcファイルをロードしない する
--api APIのみのアプリケーション設定
-f, --force ファイルが存在する場合に上書きする
-p, --pretend ドライランする しない
-q, --quiet 進捗情報を表示しない する
-s, --skip 既に存在するファイルについてはスキップ しない
-h, --help ヘルプ
-v, --version バージョンを表示

1.「C:\workspace\rails」を作成してcdする。
2.「rails new sample」をうつ。
sampleというアプリケーションのスケルトンが作成される。
バージョンを指定したい場合は「rails _4.2.7_ new sample」のように打つ。
ディレクトリツールはこんな感じ。(一部省略)

> tree /f .
C:.
│  config.ru       # Rack設定ファイル(Ruby製Webサーバ)
│  Gemfile         # Gemの定義ファイル
│  Rakefile        # Rakeの定義ファイル
├─app              # アプリのクラス、設定ファイル
│  ├─assets        # アセット(image/js/css)
│  ├─channels      #  WebSocketクラス
│  ├─controllers   # コントローラクラス
│  ├─helpers       # ビューヘルパー
│  ├─jobs          # Active Jobクラス
│  ├─mailers       # Active Mailerクラス
│  ├─models        # モデルクラス
│  └─views         # ビュー(ERBなど)
├─bin              # 各種スクリプトを配置
├─config           # 各種設定ファイルを配置
│  ├─environments  # 環境別設定ファイル
│  ├─initializers  # 初期化用設定ファイル
│  └─locales       # 国際化用設定ファイル
├─db               # データベース定義、設定ファイル
├─lib              # 自作ライブラリ置き場
├─log              # ログ出力先
├─public           # 公開ファイル置き場
├─test             # テストスクリプト
├─tmp              # テンポラリ
└─vendor           # サードパーティJS/CSS置き場

3.「rails server」をうつ。
WEBrickというRails組み込みのHTTPサーバが起動する。
4.ブラウザで「http://localhost:3000」へアクセス。
「Yay! You’re on Rails!」って出る! HTTPサーバを停止するときはDOSでCtr+cでとまる。

Rails開発の基本

Railsは大枠はMVC単位で開発していく。
MVC以外にも作成単位があり、いずれも「rails generate」コマンドを使用してソースコードを半自動生成して開発を進めていく。
ここでは、上記のサンプルアプリをもとにMVCを作成していく。

rails generateコマンド

rails generate GENERATOR [args] [options]

GENERATORには以下の種類がある。(rails generate --help)

Rails:
  assets
  channel
  controller
  generator
  helper
  integration_test
  jbuilder
  job
  mailer
  migration
  model
  resource
  scaffold
  scaffold_controller
  task

Coffee:
  coffee:assets

Js:
  js:assets

TestUnit:
  test_unit:generator
  test_unit:plugin

GENERATORの種類によって以下のファイルが生成される。(オプションで多少変化する)

GENERATOR コントローラ ビュー モデル マイグレーション アセット ルーティング テスト ヘルパー
assets × × × × × × ×
controller × ×
generator × × × × × × × ×
helper × × × × × ×
integration_test × × × × × × ×
jbuilder × × × × × × ×
mailer × × × × × × ×
migration × × × × × ×
model × × × × ×
resource
scaffold
scaffold_controller × × × ×
task × × × × × × × ×

ちなみに失敗したら「rails destroy GENERATOR」コマンドで削除できる。

コントローラ(C)の作成

■rails generate controllerコマンド

rails generate controller [NAME] [action action] [options]
  • NAME
    • コントローラ名
    • [NameSpace]/コントローラ名」とスラッシュで区切ると名前空間を設定できる。
      • 名前空間を設定するとディレクトリが分割されたり、名前空間名のプレフィックスがついたりする
  • action
    • アクション名を指定
    • 作成されるコントローラクラスのメソッド(アクションメソッド)となる

■rails generate controllerコマンドのオプション

  • 「--skip-namespace」/「--no-skip-namespace」
    • 名前空間設定がスキップされる(デフォルト:スキップしない)
  • 「-e [NAME]」「--template-engine=[NAME]」
    • 使用するテンプレートを指定(デフォルト:erb)
  • 「-t [NAME]」「--test-framework=[NAME]」
    • 使用するテスティングフレームワークを指定(デフォルト:test_unit)
  • 「--helper」
    • ヘルパーを作成するか(デフォルト:true)
  • 「--assets」
    • アセットを作成するか(デフォルト:true)

1.「C:\rubyWorkspace\sample」へcd
2.「rails generate controller hello index」をたたく
ディレクトリツリーはこんな感じ。(新規作成された箇所のみ)

create  app/controllers/hello_controller.rb
 route  get 'hello/index'
invoke  erb
create    app/views/hello
create    app/views/hello/index.html.erb
invoke  test_unit
create    test/controllers/hello_controller_test.rb
invoke  helper
create    app/helpers/hello_helper.rb
invoke    test_unit
invoke  assets
invoke    coffee
create      app/assets/javascripts/hello.coffee
invoke    scss
create      app/assets/stylesheets/hello.scss

3.コントローラクラス(hello_controller.rb)を編集

class HelloController < ApplicationController
  def index
    render text: 'Hello World !' # この行を追加!
  end
end

4.ルーティングの設定(/config/routes.rb)
アクセスURIとコントローラクラス+アクションメソッドとの紐付を「routes.rb」で行う。
今回はrails generateコマンドで自動生成されている部分の確認。

Rails.application.routes.draw do
  get 'hello/index' # この行が自動で追加されている
end

HTTPメソッドGetで「http://localhost:3000/hello/index」へアクセスするとhelloクラスのindexメソッドが呼び出される。
また、「rake routes」コマンドで現在有効なルートをリスト表示してくれる。

5.「rails server」をたたく
とめていなければ実行する必要はない。

6.ブラウザで「http://localhost:3000/hello/index」へアクセス
「Hello World !」と表示される。
これはhelloコントローラクラスのindexアクションで「render text: 'Hello World !'」の出力がそのまま表示されているだけで、ビュー機能は使用していない。

ビュー(V)の作成

Viewはrails generateコマンドで既に作成されており、「app/views/hello/index.html.erb」にある。
rails generateコマンドを実行する際、actionを指定しておくとアクションメソッドと同じファイル名(+.html.erb)で作成される。
ERB(拡張子erb)はEmbedded Rubyの略でRubyで使用されるテンプレートエンジン。

1.コントローラクラス(hello_controller.rb)を編集

class HelloController < ApplicationController
  def index
    # render text: 'Hello World !' # コメントアウト
    @msg = 'Hello World !'         # 追加行
  end
end

アットマーク(@)を付けた変数はテンプレート変数といい、ビューへ値を引き渡す役目になる。

2.ビュー(views/hello/index.html.erb)を編集

<h1>Hello#index</h1>
<p>Find me in app/views/hello/index.html.erb</p>
<%= @msg %> <!-- この行を追加-->

「@msg」はテンプレート変数でコントローラのアクションメソッドから値が渡される。

3.「rails server」をたたく
とめていなければ実行する必要はない。

4.ブラウザで「http://localhost:3000/hello/index」へアクセス
テンプレートで記述されている「Hello#index」「Find me in app/views/hello/index.html.erb」と テンプレート変数で引き渡した「Hello World !」が表示される。

ビュー(V)の変更

helloコントローラクラスのindexでテンプレート変数を使用すると「views/hello/index.html.erb」のERBテンプレートが自動的に選択される。 コントロールクラスで

render '[PATH]'

を記述するとテンプレートを指定することができる。
PATHは「/app/views」ディレクトリからの相対パスで記載し、.html.erbは省略する。

1.ビュー用のテンプレートファイル(views/hello/sampleView.html.erb)を作成

<h1>Sample View Page</h1>
<%= @msg %>

★ERBテンプレートは文字コードをUTF-8で保存する。

2.コントローラクラス(hello_controller.rb)を編集

class HelloController < ApplicationController
  def index
    # render text: 'Hello World !'
    @msg = 'Hello World !'
    render 'hello/sampleView' # この行を追加
  end
end

3.「rails server」をたたく
とめていなければ実行する必要はない。

4.ブラウザで「http://localhost:3000/hello/index」へアクセス
ブラウザで表示されたページのソースを見ると「Sample View Page」と表示されて、先ほど自作したテンプレートが使用されていることがわかる。
表示されたページをソースで見ると、なにやらその他にたくさんhtmlタグが追加されている。
これはレイアウトテンプレートというものが使用されている。
app/views/layouts/application.html.erb」を見ると「<%= yield %>」という部分があり、ここに作成したテンプレートが適用されるようになっている。
されにstylesheetやjavascriptはコントローラ単位でディレクトリがわけられて作成されたものが自動反映されるようになっている。
レイアウトの自動反映がイヤな場合は「application.html.erb」を削除もしくはリネームする。

モデル(M)の作成

Rails標準のO/RマッパーであるActive Recoredが使用できる。

■rails generate modelコマンド

rails generate model NAME [field[:type][:index] field[:type][:index]] [options]
  • NAEM
    • モデル名
    • [NameSpace]/モデル名」とスラッシュで区切ると名前空間を設定できる。
      • 名前空間を設定するとディレクトリが分割されたり、名前空間名のプレフィックスがついたりする
  • field[:type][:index]
    • フィールド名、データ型、インデックスを指定
    • type(データ型)には以下が指定できる
      • integer
      • primary_key
      • decimal
      • float
      • boolean
      • binary
      • string
      • text
      • date
      • time
      • datetime
      • timestamp
    • index(インデックス)には以下が指定できる
      • unique
      • index

■rails generate modelコマンドのオプション

  • 「--skip-namespace」/「--no-skip-namespace」
    • 名前空間設定がスキップされる(デフォルト:スキップしない)
  • 「-o [NAME]」「--orm=[NAME]」
    • 使用するO/Rマッパーを指定(デフォルト:active_record)

■Active Recordのオプション

  • 「--migration」/「--no-migration」
    • マイグレーションファイルを作成するか否か(デフォ:する)
  • 「--timestamps」/「--no-timestamps」
    • タイムスタンプ列(created_at、updated_at)を作成するか否か(デフォ:する)
  • 「--parent=[PARENT]」
    • モデルの親クラスを指定
  • 「--indexes」/「--no-indexes」
    • 外部キーにインデックスを付与するか否か(デフォ:する)
  • 「-t [NAME]」「--test-framework=[NAME]」
    • 使用するテスティングフレームワークを指定(デフォ:test_unit)

■TestUnitのオプション

  • 「--fixture」/「--no-fixture」
    • フィクスチャを生成するか否か(デフォ:する)
  • 「-r [NAME]」「--fixture-replacement=[NAME]」
    • フィクスチァを変更する

1.「C:\rubyWorkspace\sample」へcd
2.「rails generate model user no:string name:string age:integer birthday:date active:boolean」をたたく
以下のようにファイルが更新される。

invoke  active_record
create    db/migrate/20161103065150_create_users.rb
create    app/models/user.rb
invoke    test_unit
create      test/models/user_test.rb
create      test/fixtures/users.yml

3.「rake db:migrate」をたたく
Railsにはマイグレーションというテーブルの作成・変更を行う機能がある。
マイグレーションを実行するためのファイルは「db/migrate/20161103065150_create_users.rb」に自動生成されている。

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :no
      t.string :name
      t.integer :age
      t.date :birthday
      t.boolean :active

      t.timestamps
    end
  end
end

4.「rake db:fixtures:load FIXTURES=users」をたたく
Railsにはフィクスチャという機能があり、DBへテスト用データを下敷きする機能がある。
フィクスチャを実行するためのファイルは「test/fixtures/user.yml」に自動生成されている。

one:
  'no': MyString
  name: MyString
  age: 1
  birthday: 2016-11-03
  active: false

two:
  'no': MyString
  name: MyString
  age: 1
  birthday: 2016-11-03
  active: false

また、Railsでは「rails dbconsole」というコマンドでDBクライアントを起動することができる。

> rails dbconsole
SQLite version 3.15.0 2016-10-14 10:20:30
Enter ".help" for usage hints.
sqlite> .tables
ar_internal_metadata  schema_migrations     users
sqlite> .schema users
CREATE TABLE "users" (
  "id"         INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  "no"         varchar,
  "name"       varchar, 
  "age"        integer, 
  "birthday"   date, 
  "active"     boolean, 
  "created_at" datetime NOT NULL, 
  "updated_at" datetime NOT NULL
);
sqlite> select * from users;
298486374|MyString|MyString|1|2016-11-03|f|2016-11-03 06:55:13.749144|2016-11-03 06:55:13.749144
980190962|MyString|MyString|1|2016-11-03|f|2016-11-03 06:55:13.749144|2016-11-03 06:55:13.749144
sqlite> .quit

※見やすくちょっとフォーマット変更している。

上記を確認するとわかるが、以下のフィールドが自動付与されている。 - id - 自動で連番になる主キー - created_at - レコードの作成日時 - updated_at - レコードの更新日時

5.コントローラクラス(hello_controller.rb)を編集
DBから全レコード取得するロジックを書く。

class HelloController < ApplicationController
  def index
    # render text: 'Hello World !'
    @msg = 'Hello World !'
    render 'hello/sampleView'
  end
  
  # 以下、追加メソッド
  def users
    @users = User.all
  end
end

6.ビュー用のテンプレートファイル(views/hello/users.html.erb)を手動で作成
コントローラで取得したデータをテーブルで表示する。

<table border='1'>
  <tr>
    <th>No</th>
    <th>名前</th>
    <th>年齢</th>
    <th>アクティブユーザ?</th>
  </tr>

<% @users.each do |user| %>
  <tr>
    <td><%= user.no %></td>
    <td><%= user.name %></td>
    <td><%= user.age %></td>
    <td><%= user.active %></td>
  <tr>
<% end %>

</table>

7.ルーティングの設定(/config/routes.rb)

Rails.application.routes.draw do
  get 'hello/index'
  get 'hello/users' # この行を追加
end

8.「rails server」をたたく
とめていなければ実行する必要はない。

9.ブラウザで「http://localhost:3000/hello/users」へアクセス

■補足 データベースの設定は「config/database.yml」にある。

用語メモ

  • gem
    • Rubyライブラリのパッケージ管理システム
      • Lunuxでいうaptやyumみたいなもの
  • bundler
    • gemを管理する仕組み
    • Gemfileでgemパッケージのバージョン指定などが行える
  • Rake
    • Rubyで記述された様々なタスクをコマンド実行できるツール
  • RVM(Ruby Version Manager)
    • 複数バージョンのRuby実行環境を共存させる仕組み

参考