MyFirstRails

Elmの導入

概要

Railsにこれから初めて触れる方を対象にしたチュートリアルです

RailsにElmを導入するチュートリアルになります

チュートリアル

Railsのひな型を作る

まず、rails newを実行し、Railsアプリのひな型を作成します。

rails new elm

次に、作成したRailsアプリのディレクトリへと移動します。

cd elm

Webpackerを使い、Elmを導入

RailsでWeboackを使いやすくしたWebpackerというものを使用します

まず、GemfileWebpackerを追加します

gem 'webpacker', '4.0.2'

なお、Webpackerのバージョンを4.0.2としているのはElmのインストールエラー回避のためです

3.5.5だとインストール時にエラーが発生します

ref: Elm installer not working #1711

ちなみに、Webpackerでは、Vue、React、Angular、Elm、Stimulusを使用することができます

gemを追加した後、ターミナルでbundle installを実行します

bundle install

その後、Webpackerのインストールコマンドを実行します

rails webpacker:install

今回はElmを使用するのでrails webpacker:install:elmを実行します

rails webpacker:install:elm

これでElmをRailへ導入できました!

Foremanを使う

Webpackerを使う場合、ruby ./bin/webpack-dev-serverというコマンドを実行しつつ、rails sでローカルサーバーを起動する必要があります

その為、現状のままではターミナルを複数開いておく必要があり、少々面倒です

そこで、複数のコマンドを並列して実行できるforemanを使用します

まず、Gemfilegem 'foreman'を追記します

gem 'foreman'

その後、bundle install

bundle install

この時、sqlite3がインストールできないエラーが発生するかもしれません その場合は以下のようにsqlite3のバージョンを修正してbundle installを実行してください

gem 'sqlite3', '1.3.13'
bundle install

次に、foremanで使用するProcfile.devを作成します

web: bundle exec rails s
webpacker: ruby ./bin/webpack-dev-server

あとは、foreman start -f Procfile.devをターミナルで実行するだけです

foreman start -f Procfile.dev

localhost:5000にアクセスできればOkです(foremanを使用する場合、使用するポートが5000へと変更されています)

静的なファイルを作成

rails g controller コマンドを使い、コントローラーを作成します

rails g controller web index

その後、config/routes.rbを以下のように編集します

Rails.application.routes.draw do
  root 'web#index'
end

foreman start -f Procfile.devを実行して、localhost:5000でページが表示されていればOKです

Elmを使う

それではElmを使ってみましょう

先ほどElmインストールした際に、app/javascript/packs/hello_elm.jsが作成されています

app/views/web/index.html.erbに以下のコードを追加してください

<%= javascript_pack_tag 'hello_elm' %>

その後、foreman start -f Procfile.devを実行し、localhost:5000にアクセスします

ブラウザにHello Elm!と表示されていればOKです!

次に、app/javascript/packs/index.jsを以下のように作成します

import { Elm } from '../Index'

document.addEventListener('DOMContentLoaded', () => {
  const target = document.createElement('div')

  document.body.appendChild(target)
  Elm.Index.init({
    node: target
  })
})

その後、app/javascript/Index.elmを以下のように作成します

module Index exposing (..)

import Html exposing (..)
import Html.Attributes exposing (..)

main =
    div [] [text "Hello, Elm & Ruby on Rails!"]

最後に、app/views/web/index.html.erbに以下のコードを追加します

<%= javascript_pack_tag 'index' %>

あとは、foreman start -f Procfile.devを実行し、localhost:5000にアクセスします

ブラウザにHello, Elm & Ruby on Rails!と表示されていればOkです!