好みの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の追加などちょっと手を加える必要があるようでした。

class UsersController < ApplicationController
  ...

  def user_params
    params.require(:user).permit(
      :email,
      :first_name,
      :last_name,
      :first_name_kana,
      :last_name_kana,
      :profile
    )
  end
end

こんな風にpermitするparameterがたくさんある時、

class UsersController < ApplicationController
  ...

  def user_params
    params.require(:user).permit(%i(
      email
      first_name
      last_name
      first_name_kana
      last_name_kana
      profile
    ))
  end
end

こう書くと増減した時のメンテが楽。

https://gyazo.com/3dc2e3fa74ea4c8439c92a455fb82ba2

https://gyazo.com/ce4278cef60e690514be5a446071da75

Preference > Editor > General > Appearance > Show parameter name hintsをオフ

https://gyazo.com/9f5a051974e11ba93489972acfba17bb

@jnchitoさんありがとうございます!

概要

テスト用のfixturesとseedデータを$ rails db:fixtures:loadを使うことによって共通化する方法です。

やり方

db/seed.rbにこう書く。

# db/seed.rb:
Rake::Task["db:fixtures:load"].execute

メリット

  • seedとfixturesがDRYになる。
  • テスト時のデータが画面から見える。
  • テストに使っているエッジケースのデータを普段から意識するようになる。

Q&A

Q. factory_girlの場合は?

A. factory_girlは素人にはおすすめできない。まずはRailsデフォルトのfixturesを使いこなしましょう。

Q. seed-fuは?

A. 窓から捨てましょう。

Q. 画像ファイルがseedに必要な場合は?

A. 良い質問です。こちらを参考にしてください。

db:fixtures:loadの後処理をする - komagataのブログ