LoginSignup
5
2

More than 3 years have passed since last update.

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

Posted at

はじめに

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

スクリーンショット 2020-01-12 00.20.29.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) 黒田 努

この本を手に取り、一日で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


brew install rbenv ruby-build

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

Ruby

rbenv install x.x.x
rbenv global x.x.x #有効化
ruby -v #確認

挫折した言語が多いだけあって環境構築には慣れています。

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

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

適当なディレクトリで


rails new helloandcalc -BCMT --skip-coffee -d sqlite3

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

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

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

cd helloandcalc
bundle install

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

アプリケーションの実装

コントローラーの生成

bin/rails g controller controller top index

ここでapp/controllersを開いてみると、

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を開き、中身を全削除して

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を開き

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的なやつだ!

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

スクリーンショット 2020-01-11 23.34.04.png

エラーが出ます。

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メソッドは

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2