Rails(Ruby)と比べて理解するPhoenix(Elixir)〜コマンド編〜


## はじめに
いまさらながらElixirとPhoenix触ってみました。「Railsに似ている」と噂されていますが使っているうちに「そんなの嘘だっ！」と何度もなりかけまして、イマイチ理解も進まなかったので、Rails と Phoenix を比較して理解を進めることにします。

今回はプロジェクトを立ち上げる際に使うコマンドをまとめていきます。
間違いなどありましたら指摘して頂ければと思います。

## Elixirのいろは
とは言ってもまずはElixirについて知る必要がありましたので、下記サイトで一通り触ってみました。

[elixir school](https://elixirschool.com/)
elixirの基礎を知れます。いろいろなサイトを見ましたが、これをやっておけばひとまず間違いないです。

[Phoenix入門1 - Hello Phoenix](http://ruby-rails.hatenadiary.com/entry/20151011/1444560106)
phoenixで静的ページを作成する所まで解説しています。

それでは、次からRailsとPhoenixの比較をしていきます。

## rake と mix
mixはrailsで言うrakeとrails gなどの両方の役割を持っています。

### プロジェクトを開始する
```rails
$ rails new project_name -d mysql
```

```phoenix
$ mix phoenix.new project_name -database mysql
```

### コマンド確認

```rails
$ rake -T
```

```phoenix
$ mix -h
```

### バージョン確認
```rails
$ rails -v
# => Rails 4.2.4
```

```phoenix
$ mix phoenix.new -v
# => Phoenix v1.1.4
```

## DB
### DB作成
```rails
$ vim config/database.yml
$ rake db:create
```

```phoenix
$ vim confg/config.exs
# config.exsはprod環境です。dev.exs, test.exsはそれぞれの環境を表しています。
$ mix ecto.create
```


### テーブル作成
```rails
$ rails g migration create_users_table name:string email:string
# => db/migrate/2016xxxxx.rb
$ rails db:migrate
```

```phoenix
$ mix ecto.gen.migration create_users
# => priv/repo/migrations/2016xxxxx.exs
$ vim priv/repo/migrations/2016xxxx.exs
$ mix ecto.migrate
```

```priv/repo/migrations/2016xxxx.exs
defmodule ChatPhoenix.Repo.Migrations.CreateUsers do
  use Ecto.Migration

  def change do
    create table(:users) do
      add :name, :string, size: 40
      add :email, :string

      timestamps
    end
  end
end
```

詳しくは: [Ecto.Migration docs](https://hexdocs.pm/ecto/Ecto.Migration.html) まで。

## パッケージ管理
```rails(gem)
$ vim Gemfile
$ bundle install --path vendor/bundle
```

```phoenix(mix)
$ vim mix.exs
$ mix deps.get
```

```mix.exs
...省略...

  def application do
    [mod: {ChatPhoenix, []},
     applications: [:phoenix, :phoenix_html, :cowboy, :logger, :gettext,
                    :phoenix_ecto, :postgrex]]
  end

...省略...
```
https://hex.pm/ からパッケージを探すことが出来ます。


## Model作成
```rails
$ rails g model User name:string email:string --skip-migration
# => app/models/user.rb
```

```phoenix
$ mix phoenix.gen.model User users name:string email:string --no-migration
```

## ページ作成
```rails
$ rails g controller users index
# => app/controllers/users_controller.rbとapp/views/users/index.html.erbを作成
```

```phoenix
$ mix phoenix.gen.html User users name:string email:string --no-migration --no-model

* creating web/controllers/user_controller.ex
* creating web/templates/user/edit.html.eex
* creating web/templates/user/form.html.eex
* creating web/templates/user/index.html.eex
* creating web/templates/user/new.html.eex
* creating web/templates/user/show.html.eex
* creating web/views/user_view.ex
* creating test/controllers/user_controller_test.exs
```

###ルートの追加
```rails(config/routes.rb)
Rails.application.routes.draw do
  resources :users, only: :index
end
```

```phoenix(web/router.ex)
defmodule ChatPhoenix.Router do
  use ChatPhoenix.Web, :router
  
  ...省略...

  scope "/", ChatPhoenix do
    pipe_through :browser # 上記の :browser の処理を行う

    # "GET /"にアクセスすると、PageControllerのindexアクションが呼ばれる
    resources "/users", UserController
  end
end
```

## 所感
整理したら、アプリケーション作る時の最低限のコマンドやファイル配置はわかるようになりました。次はコントローラーやモデルの中身など詳細を比べてみようかと思います。

[翻訳: 似て非なる Phoenix と Rails（原題『Phoenix is not Rails』）](http://qiita.com/mserizawa/items/f32469bcac61aa6fa491)がPhoenixとRailsの違いをわかりやすくまとめています。良ければ読んでみてください。