Elixir+Phoenix FrameworkをMacにインストールし、Hello WorldページとDB作成＆マイグレーションまで


何番煎じかわかりませんが、作業ログがなにかの役に立てば。

http://www.phoenixframework.org/docs/overview

を参考にしています。

## 目標と前提

### 目標

+ Elixir + PhoenixFrameworkのインストール
+ Controller/View/ルーティングを作成し、Hello Worldの表示
+ データベースのセットアップとスキーマ作成(マイグレーション)


### 前提

+ OS X El Capitan (10.11.4 Beta)
+ Homebrew インストール済み
+ DBはSQLiteを使う
+ Railsの使用経験がある

## インストール

### 準備

Homebrewを最新にしておきます。

```
brew update
```

### ElixirとHexのインストール

Elixirをインストールします。
Erlangもインストールされます。

```
brew install elixir
```

Hexをインストールします。
HexはRailsにおけるrakeのようなものです。

```
mix local.hex
```

### Phoenix Frameworkのインストール

Phoenix Frameworkをインストールします。
(2016/4現在：下記で常に最新版になるようです)

```
mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

### nodeのインストール

アセットコンパイルにbrunch.ioを使用する場合、node.jsをインストールします。

```
brew install node
```

### アプリケーションの作成

mix phoenix.newでアプリケーションを作成します。
app_nameの部分を適宜アプリケーション名に置き換えてください。
(小文字英数字およびアンダースコアのみ使用できるようです)

```
mix phoenix.new app_name --database sqlite
```

今回はSQLiteを使用しますが、

```
--database mysql
```

などのオプションでデータベースは変更できます。
デフォルトではPostgreSQLを使用するようです。

その他のオプションについては

```
mix phoenix.new --help
```

で参照できます。

### サーバーの起動

```
cd app_name
mix phoenix.server
```

で、localhost:4000でサーバーが起動します

![phoenix-run.png](https://qiita-image-store.s3.amazonaws.com/0/56184/2299970c-c03b-d5ab-ba61-d59e84e5b2b1.png "phoenix-run.png")

ここまででインストールは終了です。

## 静的ページを作成する

続いて、静的ページでHello Worldを表示するまでを行います。

/hello

以下でHello Worldを表示するのが目標です。

MVCにおけるViewとControllerを作成します。

### Controllerを作成する

**/web/controllers/hello_controller.ex**

という名前でControllerのファイルを作成し、


```
defmodule AppName.HelloController do
  use AppName.Web, :controller

  def index(conn, _params) do
    render conn, "index.html"
  end
end
```

とします。

### Viewを作成する

**/web/views/hello_view.ex**

という名前でViewのファイルを作成し、

hello_view.exを

```
defmodule HelloPhoenix.HelloView do
  use HelloPhoenix.Web, :view
end
```

とします。

### テンプレートを作成する

**/web/templates/hello/index.html.eex**

という名前でテンプレートファイルを作成し、

```
<div class="jumbotron">
  <h2>Hello World!</h2>
</div>
```

とします。
.eexファイルはRailsにおけるERBのようなもののようです。


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

最後にルーティングを設定し、表示できるようにします。

**web/router.ex**

の中ほど


```
  scope "/", AppName do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
  end
```

となっている部分を

```
  scope "/", AppName do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/hello", HelloController, :index
  end
```

として、/hello以下でHelloControllerを使用するよう設定します。

### 起動してみる

オートリロードされるので、すでにサーバーを起動していたらlocalhost:4000でこう表示されます。


![phoenix-vc.png](https://qiita-image-store.s3.amazonaws.com/0/56184/e8cd914c-4a66-2c91-0bc4-f42d780ae565.png "phoenix-vc.png")


もし途中でエラーなどが出て止まっていたら、再度

```
mix phoenix.server
```
で起動します。

## DBを使う(マイグレーション)

最後に、DBスキーマを作成してみます。
タイトルと内容を持つページを作成することにします。

### データベースを作成する

まずはデータベースを作成します。

```
mix ecto.create
```

### マイグレーション

次に、マイグレーションを行います。


```
mix ecto.gen.migration create_pages
```

で、マイグレーションファイルを作成すると、

```
* creating priv/repo/migrations
* creating priv/repo/migrations/20160423080515_create_pages.exs
```

などと表示され作成されるので、

**priv/repo/migrations/20160423080515_create_pages.exs**

を以下のように編集します。

```
defmodule AppName.Repo.Migrations.CreatePages do
  use Ecto.Migration

  def change do
    create table(:pages) do
      add :title, :string
      add :body, :string
      timestamps
    end
  end
end
```

そしてマイグレーション実行。

```
mix ecto.migrate
```

Railsとほぼ同じ感覚です。

以上です。