Rails Templateを使ってみる

最近なんか作ろうかと思ってから、作業開始するまでに寄り道してしまうことが多いような気がするので、開発効率上げるために、以前から利用してみたかったRails Templateを使ってみた。

公式

Rails アプリケーションのテンプレート - Railsガイド

これ

rochefort/rails_template

概要

mainの処理をafter_bundle以下に記載。
細かくメソッド分割したので、これを見たら、なんとなく概要は分かるかと思う。

after_bundle do
  run "spring stop"

  ## initial commit
  git_commit "rails new", with_rubocop: false

  ## install gems
  proc_install_rubocop
  proc_install_rspec
  proc_install_simplecov
  proc_install_pry
  proc_install_hamlit

  ## uninstall gems
  proc_uninstall_jbuilder if yes?("Would you like to uninstall jbuilder? (y/n): ")

  ## i18n
  proc_localize if yes?("Would you like to localize to Japan? (y/n): ")

  ## railtie
  proc_setup_railties

  ## initializers
  proc_setup_initializers
end

after_bundleは初回にrails newやらwebpacker insatllした後の処理。
個人的には、デフォルトのrails newから変更を加えていく方式でコミットしたかったので、このようにした。

はまりどころ

spring

最初にspringを止めておかないと、以降のrails genarateが動作しなかった。(この辺は何が正しいかわからないが、止めたらうまくいった。)

run "spring stop"

その他

rubocop

とりあえずrailsのmasterを利用する形にした(Style/FrozenStringLiteralComment だけdisable)。
この辺はRails.versionでそれぞれのmasterの物を取得するようにしても良いかもしれない。
(他に良い方法がないだろうか)

まとめ

springの件ではまったりしたが、ユーザ入力に応じて実施することを変えられたりできるので、割となんでもできるという印象だが、 この辺はRailsやgemのversionによってちょいちょい変えていかないといけないので、 お仕事で使うなら本当にベーシックな物だけ揃えて、メンテナンスコストを下げておかないと辛くなりそう。

ご参考

Rails6.0.3.2 has been released!

Rails 6.0.3.2 has been released! | Riding Rails

security updateがreleaseされてました。
珍しい脆弱性だったのでご紹介。
急いであげる必要はないような脆弱性ですが、対応したい人は上げておきましょう。
 

内容

ここに書かれてます。
[CVE-2020-8185] Untrusted users able to run pending migrations in production

Using this issue, an attacker would be able to execute any migrations that
are pending for a Rails app running in production mode. It is important to
note that an attacker is limited to running migrations the application
developer has already defined in their application and ones that have not
already ran.

Pending Migrationが実行できるというなんとも変わった脆弱性でした。 というよりも、例外の詳細を表示させることができ、PendingMigrationがある場合は実行できるというもののようでした。

patchをみても、脆弱性の全容が全く分からなかったのですが、
ググってみると、ActionableExceptions に関するもののようで エラー画面からmigrateできる機能に関するもののようです。
こんなんあったんですね。(必要性は感じないけど)

以下に画像付きで紹介されてました。
rails commit log流し読み(2019/04/19) - なるようになるブログ

shellscriptでDBに大量データを登録する

ストアドプロシージャ使えない(面倒)、Rails Console利用できない場合にBulk Insertする例。すぐ忘れるのでメモ。

#!/bin/bash
set -eu

DB_USER="root"
DB_PASS="pass"
DB_NAME="db"
DB_HOST="host"

INSERT_NUM=100000
BREAK_NUM=1000

function execute_sql () {
  local sql=$1
  mysql -u "${DB_USER}" -p"${DB_PASS}" -h "${DB_HOST}" "${DB_NAME}" -e "${sql}"
}

function main () {
  local insert_statement="INSERT INTO some_table (some_column)"
  insert_statement+=" VALUES"

  local bulk_count=0
  for((i=0;i<INSERT_NUM;i++)); do
    if [ $bulk_count -eq 0 ]; then
      sql="${insert_statement}"
    else
      sql+=", "
    fi

    # values
    sql+="('some_value')"
    bulk_count=$(expr $bulk_count + 1)

    if [ $bulk_count -eq $BREAK_NUM ]; then
      execute_sql "${sql}"
      bulk_count=0
    fi
  done

  # 端数のinsert
  if [ $bulk_count -ne 0 ]; then
      execute_sql "${sql}"
      bulk_count=0
  fi
}

main

久しぶりにshell書くといろいろ辛く感じる。。 rubyで書けばよかった。。