皆様におかれましては、webpackerでのrubyとjsのインテグレーションが思いのほかうまくはまり、

javascript_include_tag "application"外したい!」

などと言っている方も多いでしょう。俺もです。

rails-ujsからrails-ujs(npm)へ

これも皆そうだと思いますが、rails-ujsは「削除リンク」でしか使ってないけど、いつも使ってるので欲しい。

rail5.1からrails-ujsは単独reposからactionviewの中に入ったそうです。

rails-ujs(npm)を追加。

$ yarn add rails-ujs

app/javascripts/packs/rails-ujs.js作成。

import Rails from 'rails-ujs';
Rails.start();

app/javascripts/packs/application.jsに下記追加。

require("./rails-ujs.js");

turbolinksもnpmで(行けるなら)行きたいですね。

「知り合いの凄腕エンジニアに聞いたんだけど、/users/32ってURLにユーザー数が丸見えになってるって、このセキュリティーは流石にまずいよ、駒形さん」

みたいに言われることが稀によくあるので、idをuuidにしました。

postgresの設定

rails5からpostgresのuuidを生成する関数を簡単にidとして使えるようになってるそうです。 herokuのpostgresは対応してるのでいいかもです。

Macのbrewで入れたpostgresはデフォルト無効なので有効にしてあげる必要がありますが、superuserじゃないと駄目です。

postgres=# SELECT uuid_generate_v4();
ERROR:  function uuid_generate_v4() does not exist

↑関数がない。

デフォルト状態ならばsuperuserはpostgresかつパスワード無しなので、下記をやっといてくださいと各位に伝えます。

$ psql -d postgres -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'
postgres=# SELECT uuid_generate_v4();
           uuid_generate_v4           
--------------------------------------
 06162241-ad98-4795-8bab-3801194f76d7
(1 row)

関数が有効になりました。

railsの設定

generatorがデフォルトでuuidを使うようにします。

# config/application.rb:
module Foo
  class Application < Rails::Application
    config.generators do |g|
      g.orm :active_record, primary_key_type: :uuid
    end
  end
end

こちらを参考にidのdefaultを設定する。

2 UUID Primary Keys

class PostProperties < ActiveRecord::Migration[5.1]
  def change
    create_table :posts, id: :uuid, default: "gen_random_uuid()" do |t|
      t.string :title
      t.text :description
      t.belongs_to :user, foreign_key: true, type: :uuid

      t.timestamps
    end
  end
end

foreign_keyを設定する時に、type: uuidを忘れないこと。

# SELECT id FROM users;
                  id                  
--------------------------------------
 75a61708-a959-5889-83cd-4d86df9cd771
 7c6b7130-3896-53a1-938d-2ab4364011d2
 f94db8c4-6786-5027-8d90-aa187594addb
 bafbab57-d268-548a-a111-11c13bbcbcc2
 2fc060cd-98d2-58d2-9b33-50f36df1fd8f
 8338b729-ff29-55d2-b5ba-6d68dbfc7b03
 917358a7-8995-5d88-b635-925e21841f68
 529aa2fb-93b3-5739-a8d4-64dd87ed08a9
 6ea9b086-d16b-5b02-81b6-97edb74f3dfb
 71f372c5-b0cc-5904-a583-921766bf4508
(10 rows)

ウェーイ。

おもてなし

何かと外見も重要な、出資を受けたスタートアップのサービスのアプリを開発する時にはさらっとやっておくとよいかもしれません。

下記でいつもやってるパンくずリストの表示方法についてご紹介しました。

いつもrailsで使ってるパンくずのコード - komagataのブログ

しかし弟が、

「ブログにかけるぐらい決まりきってるんだったらgemにすればいいじゃん。馬鹿なの?」

というのでgemにしました。

komagata/pankuzu: Generate breadcrumbs simply.

Dr. 林「まさかとは思いますが、この『弟』とは、あなたの想像上の存在にすぎないのではないでしょうか。」

使い方

ほとんど以前説明したままですが、

$ rails generate pankuzu:install

app/views/application/_breadcrumbs.html.erbを生成するようになっています。

最後のパンくずにもリンクを貼るようにしたのは、Googleが推奨してる方法がそうだからです。

microdataやjson+ld対応については僕が仕事でよくやるログイン必須サイトでは要らないし、上記テンプレを各自修正した方が楽だと思うのでやってません。

好みのgemが無いのでいつも書いてるヤツをご紹介します。gemにすると仰々しくなりそうでしない。

使い方

例えば、

トップページ > ブランド一覧 > ブランド個別 > モデル個別 > グレード個別

のような構造になってる車のサイトのグレード個別ページの場合。

indexやshowのviewの上の方に書く。(設定ファイルやcontrollerに書くやり方は好かん)

リンク文字とURLをadd_breadcrumbする。

- add_breadcrumb "全てのブランド", brands_path
- add_breadcrumb @grade.model.brand.name, @grade.model.brand
- add_breadcrumb @grade.model.name, @grade.model
- add_breadcrumb @grade.name, @grade

(ビューの色々)

最後のパンくずはリンク無しになります。 トップページはいつもHOMEかつroot_pathなので決め打ちです。

見た目はこんな感じになります。

https://gyazo.com/18c6e5b5e46fd324c0383c1979d81f7a

HTMLはこんな感じになります。

<ol class="breadcrumbs">
  <li class="breadcrumb"><a href="/">HOME</a></li>
  <li class="breadcrumb"><a href="/brands">全てのブランド</a></li>
  <li class="breadcrumb"><a href="/brands/455594730">メルセデス・ベンツ</a></li>
  <li class="breadcrumb"><a href="/models/64350864">Aクラス</a></li>
  <li class="breadcrumb">A 180</li>
</ol>

実装

実装は下記2ファイルです。いつもこれを前のプロジェクトからコピーしてます。

パーシャルファイルのマークアップは毎プロジェクト変わりますが、helperの方はずいぶん前から変わってない。

# app/helpers/breadcrumbs_helper.rb:
module BreadcrumbsHelper
  def add_breadcrumb(name, path)
    unless @_breadcrumbs
      @_breadcrumbs = [OpenStruct.new(name: "HOME", path: root_path)]
    end

    if @_breadcrumbs
      @_breadcrumbs << OpenStruct.new(name: name, path: path)
    end
  end

  def breadcrumbs
    @_breadcrumbs
  end
end
# app/views/application/_breadcrumbs.html.slim:
- if breadcrumbs.present?
  ol.breadcrumbs
    - breadcrumbs.each do |breadcrumb|
      li.breadcrumb
        - if breadcrumbs.last != breadcrumb
          = link_to breadcrumb.name, breadcrumb.path
        - else
          = breadcrumb.name

使用感

意識低い感じですが、僕としては以前はパンくずごときでイライラしてたのでこのゆるい実装が心地よいです。

webpacker3系はでかいメリットがあるんですが、yarn 0.25.2以上じゃないと動きません。

herokuのruby buildpackは0.22.0固定なのでこちらのPRを出してる方のreposを使いましょう。

$ heroku buildpacks:set https://github.com/rcugut/heroku-buildpack-ruby#yarn-version-update
$ heroku buildpacks:remove heroku/ruby

マージされたらデフォルトのに戻しましょう。

リリース前はHerokuであっても公開したくないお客様も多いのでいつも書くやつ。

class ApplicationController < ActionController::Base
  http_basic_authenticate_with name: "user", password: ENV["BASIC_AUTH_PASSWORD"] if Rails.env.production? || Rails.env.staging?
end

全てのrailsアプリに入れてるmeta-tags gemですが、デフォルトでmeta keywordsの中身を小文字にします。

日本語的には(Aクラス → aクラスなど)小文字にされると困るので、必ず下記を設定。

# config/initializers/meta_tags.rb:
MetaTags.configure do |config|
  config.keywords_lowercase = false
end

この設定最近のバージョンで追加されたようなので皆さんチェックしてみてください。

ss

Mac版が検索しても出てこなかったので。

https://github.com/mononok/RimWorld-Ja-sandbox

の中身を下記に上書き。

/Users/ユーザー名/Library/Application Support/Steam/steamapps/common/RimWorld/RimWorldMac.app/Mods/Core/Languages/Japanese

@machidaさんがholiday-jpのアイコンを作ってくれました。

https://gyazo.com/1488e11d6d99c10cd0e8a52ce459fa3d

かわいい!ありがとうございます!

最近、Next Holidayのリニューアルでholiday-jpを久しぶりに触ったらAPIが糞過ぎた。

nextとかprevとかのメソッドが無いなんて使い辛スギィ > 昔の俺

8年振りに会社ページがリニューアルされました。

Fjord, LLC

https://gyazo.com/1b08a0812b9ad48186bb98309ca57257

hugoで作ってGithub Pagesで公開しています。

デザインに関しては@machidaさんの記事をご覧ください。

会社サイトをリニューアルしました | FJORD, LLC(合同会社フィヨルド)

デザインもhugoも@machidaさんがやったので僕はほとんど何もやってないですが、

「ページをpushするとCircleCIでbuildしてアップ」

という部分だけやりました。

https://gyazo.com/6eb17855ad55e53f0ce9302bc099611e

fjordllc/fjordllcリポジトリのsourceブランチにmarkdownの記事ファイルをアップするとCircleCIがhugoでbuildしてmasterにpushします。 masterブランチのdocsディレクトリがGithub Pagesで公開されるようになっています。

CircleCIのcircle.yml

general:
  branches:
    ignore:
      - master

machine:
  timezone: Asia/Tokyo
  node:
    version: 8.2.0

dependencies:
  pre:
    - git config --global user.name "Masaki Komagata"
    - git config --global user.email "komagata@gmail.com"
    - wget https://github.com/gohugoio/hugo/releases/download/v0.26/hugo_0.26_Linux-64bit.deb
    - sudo dpkg -i hugo_0.26_Linux-64bit.deb

compile:
  override:
    - HUGO_ENV=production webpack
    - hugo

test:
  override:
    - echo "dummy"

deployment:
  production:
    branch: source
    commands:
      - ./deploy.sh

deploy.sh:

git clone --depth=1 git@github.com:fjordllc/fjordllc.git master
cp -rp docs master/
cd master
git checkout master
git add docs
git commit -a -m "Update articles"
git push origin master --force

ハマッたところ

Custom domain設定が定期的にリセット

Github Pagesは以前は対象の公開directory/CNAMEというファイルにcustom domain名を書くことで設定することになっていました。

これは最近、githubの管理画面から入力できるようになりました。管理画面で入力したものが自動的に公開directory/CNAMEに保存されるというラッパー的な機能です。

僕はreposが勝手に更新されるということが頭になかったので、hugoでbuildするたびに対象ディレクトリをクリーンアップしていました。

そのため、buildするたびにcustom domain設定がリセットされてしまうということになっていました😢

buildが永久ループ

pushをトリガーにCircleCIがbuildして自分のmasterにpushするので永遠にbuildが続いてました😢

CircleCIにはbuildしないbranchを指定できるのでmasterではbuildしないようにしました。

次にやりたいこと

esa.ioをhugoのエディターとして使うというのをやりたいです。

連携の設定をやってみたのですが、esa.ioが吐くFront MatterはMiddleman用のものなので、hugoでは日付フォーマットやurlの追加などちょっと手を加える必要があるようでした。