Elixir/Phoenixがままならない初学者がはじめるRuby on Rails



#はじめに

この画面を見てください。

<img width="800
" alt="スクリーンショット 2020-01-12 00.20.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306722/c38d0a05-91db-6119-70bb-5941d4a84f56.png">


なんてことないRailsのWeb表示ですが、わたしは**きょう**Ruby on Railsをはじめました。

ポエミーかつ、実際のテンプレートとコントローラーのコードは最後ののほうなので、どうかブラウザバックしないで読んでください。

もともとわたしはバンドマン/サポートギタリストを経て音楽制作をメインにする人間で、宇宙一好きなソフトウェアはAbleton Live。
プログラミングをはじめて1ヶ月でJavaの教本を捨てElixirを志し、そのために北九州へ10ヶ月渡っていました。いまではHHKB狂です。

現在都内のElixir/Phoenixの企業でインターンさせてもらっているものの、なかなか現実は厳しい。
しかも国内にはまだ十分なElixir初学者向けドキュメントもない。

"やりたいことがお金にならない”

これじゃ音楽と同じじゃん！

しかし音楽で培った負けずに食い下がる努力が身を結び、その企業がもともと専門だったRuby on Railsをやってはどうか、というくだりに。

[改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)   黒田 努](https://www.amazon.co.jp/dp/429500460X/ref=cm_sw_r_tw_dp_U_x_GOCgEbQ85P4FF)

この本を手に取り、一日で80ページほど進めました。

”Elixirと似てるから"頑なに手を出していなかったruby。

しかし"Elixirと似てるから"たった一日でめっちゃ学びがあったので、サンプルPJを自分で考えながらエントリをしたためてみます。

#環境構築

現在の環境
Apple MacBook Pro(16inch, 2019)
2.3GHz 8core Core i9/32GB RAM/1TB SSD/Radeon Pro 5500M 4 GB 
(これでも音楽制作はマルチコア並列処理が厳しくて全然速くないです)

macOS 10.15.2

Xcodeやコマンドライン・デベロッパ・ツール、HomeBrewのインストールは前提として割愛します。
(Time Machine復元を行わず環境をつくったのでC++やるときにこの辺で手こずった気がする)

###rbenv 

```ruby

brew install rbenv ruby-build
```
(Elixirでいうとこのasdfかぁ、あれもバージョン指定わかんなくてkokura.exのもくもく会で入れたなぁ...)

###Ruby

```ruby
rbenv install x.x.x
rbenv global x.x.x #有効化
ruby -v #確認
```
挫折した言語が多いだけあって環境構築には慣れています。

**が**

いろいろ端折りますが、こんだけかよ！
デフォルトではSQLite３というデータベースを使用する模様。
ElixirのときはPostgresの構築ミスってiexが真っ赤になったぞ...

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

適当なディレクトリで

```ruby

rails new helloandcalc -BCMT --skip-coffee -d sqlite3
```
bundleコマンドを後で使うから-B(Phoenixでいうmix deps.getかな？)
CMTに関してはとりあえず使わないものを引数指定して生成しない。

-dはデータベースをを指定します。
（SQLできるようになりたいけどまだ一切いじれないんだよな...)

これでPhoenixとかなり似たノリのPJが作成されました。
（U2のボノのディレイワークをロバート・フリップがパクった、的な言い方ですが...)

```ruby
cd helloandcalc
bundle install
```

これでGemfile.lockに基づいて必要なGemパッケージがインストールされるようです。
（やっぱりmix deps.get?)

#アプリケーションの実装

###コントローラーの生成

```
bin/rails g controller controller top index
```
ここでapp/controllersを開いてみると、

```ruby:app/controllers/top_controller.rb

class TopController < ApplicationController
  def index
  end
end
```

class ~はオブジェクト指向っぽいですね。
意図して作成したTopControllerクラスはもともとのApplicationControllerというクラスを継承している、ということでしょうか。

そしてdef ~ endというElixirのモジュールでおなじみの記法。
Rubyではメソッドと呼ぶそうです。やはりオブジェクト指向。。

###ルーティング
RailsにはMVCというアーキテクチャがあり、
モデルがDBのデータを扱い、コントローラがそれを受け取ってビューというHTMLに埋め込まれたテンプレートを介してクライアントのブラウザにデータ表示をする。
その受け渡しのためにPJのルーティングをいじる。
Phoenixでは完全な写経に終わっていたこのあたりが明確に学び始められています。

私見ですが"サーバーサイド”という概念を知ってからえっじゃあフロントってマジでめっちゃ表面のことじゃん、とか、バックエンドってじゃあほとんどインフラ屋ってこと!?と日々混乱しています。

話が逸れた。ルーティングをいじります。
configディレクトリ配下のroutes.rbを開き、中身を全削除して

```ruby:config/routes.rb
Rails.application.routes.draw do
  root "top#index"
end
```

Node.jsで”なにが書いてあるか全くわからない"と挫折したことがあるのですが、
こういうときはフレームワークのライブラリやモジュールが使われているんですね。

これで”トップページに対応するアクションがTopControllerのindexになった"

ということになります。

###ビューの作成

さあいよいよHTML埋め込みのテンプレート作成だ。
Phoenixだとindex.html.eexで<%= =>で囲って埋め込むやつですね。
だと、っていうかRailsでもまるっきり同じやん！

app/views/top配下のindex.html.erbを開き

```ruby:app/views/top/index.html.erb
<h1><%= @hello %></h1>
<p><%= puts 2 * @calc %></p>
```
としておきます。

ここでPJとして作成したhelloandcalcフォルダに移動し
```
bin/rails s
```
さんざん叩いたPhoenixのiex -S mix phx.server的なやつだ！

しかしテンプレートだけつくってコントローラーをいじっていないので

<img width="500
" alt="スクリーンショット 2020-01-11 23.34.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306722/ab201906-c494-9d98-8a36-cae9b00c6dd9.png">

エラーが出ます。

#Rubyの文法をテンプレートに埋め込むぞ

小一時間格闘し、テンプレート上でやっちゃいけない式などをエラーと睨めっこしながら最終的にできたコードがこちらです。

```ruby:app/views/top/index.html.erb
<h1><%= @hello %></h1>
<p><%=   @calc  %></p>
<p><%= "わたしの生まれ年は1989年です。" %></p>
<p>kmizuno0211の生まれ年をtop.controller.rbに表記:</p>
<p>@yearの値は: <%= @year %></p>
<p>わたしは西暦 <%= @year %> 生まれです。</p>
<p>西暦から1988を引くと:<%= heisei = @year - 1988 %></p>
<p><%= "わたしは平成#{heisei}年生まれです。" %></p>
```

コントローラーのindexメソッドは

```ruby:app/controllers/top_controller.rb
class TopController < ApplicationController
  def index
    @hello = "Hello"
    @calc = 2 * 6
    @year = 1989
   
  end
end
```

つぎはぎを繰り返して、当初のhelloandcalcとPJ名を決めたときの設計から大幅に逸れています。苦笑
曲作っててもよくあることです。道具使って習熟したんならよし！（大甘)

#おわりに

学習はサクサク進んでもいざ自分でつくろうとなると様々なエラーに直面するものです。
最後にズッコケなんですがせっかくだしと思って行ったコマンドでのgitへのpushがエラーに阻まれるという（泣)

マルチコア並列処理やデータ量増大を見越して、わたしは関数型言語Elixirに賭けています。
が、”Elixirと似てるから"頑なにやらなかったRuby on Railsから、おおきな学びを得始めました。

うまず、たゆまず、頑張ります。

Kento Mizuno