rails

【追記】Rails v7.1.0 で `can't be blank` が `can’t be blank` に変わる(リバートされました)

既存アプリやライブラリへの影響が大きく、この変更に対してネガティブなフィードバックも多かったためリバートされました。 github.com 概要 表題の通り、Rails v7.1.0 で APOSTROPHE (U+0027) が SINGLE QUOTATION MARK (U+2019) に変わります。 github.co…

Railsの DATABASE_URL で指定できるパスワードの文字種

Railsアプリケーションを動かすAWSリソースをTerraformで作る場合、random_password を使ってDBパスワードを生成します。 しかし、 DBパスワードに一部の記号が含まれていると環境変数 DATABASE_URL で渡す際に URI::InvalidURIError が発生してしまうため、…

RailsアプリをRBS + Steepで型チェックするまでの手順

rails new してから steep check が通るまでにやってみた作業をまとめておく。 GitHub コードはGitHubで公開しているので、詳細な手順を知りたい方は参照してください。 github.com 手順 gemを入れる steepとrbs_railsをGemfileに追加する。 # Gemfile group…

Railsアプリの開発環境向けDockerfile + docker-compose.yml

人に説明するときに記事あると便利なので、開発環境向けのDockerfileとdocker-compose.ymlを書いておく。 Dockerfile FROM ruby:3.0.0 WORKDIR /app # Using Node.js v14.x(LTS) RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - # Add packa…

assets:precompileの結果を1世代だけ残す

Sprocketsは assets:clean[0] しても1時間以内に作成したassetsは消してくれません。 参照: https://github.com/rails/sprockets/blob/v4.0.2/lib/sprockets/manifest.rb#L245 さらに assets:clean の後に webpacker:clean を実行してくれるけど、引数は伝搬…

Herokuでカスタムドメイン(ルートドメイン)を使うためにCloudFrontを設定する

Route53で取得したカスタムドメインをHerokuで使うためにCloudFrontの設定をしたのでブログに書いておく。 コード例は foo.herokuapp.com で動くアプリケーションを foo-example.com でアクセスできるようにする設定です。 AWS側の設定 CloudFrontで使うacm…

CIでRailsのmasterブランチを使ってテストを実行する

Rails edgeでCIを動かしたい酔狂な人向けに記事を書いておく。 Rails edgeのGemfileを用意する # gemfiles/rails_61.gemfile eval_gemfile File.expand_path('../Gemfile', __dir__) dependencies.delete_if { |d| d.name == 'rails' } gem 'rails', github:…

Railsで認証機能を自作する?それともDeviseを使う?

定期的にDevise批判の話が出てくるので、個人的な考えを書いてみます。 Railsに詳しくないなら、Deviseを使わないべきか? 「認証自作、 Rails 、 Devise」の記事で以下のような記載がある。 「Rails について深い理解がないならば、 Devise は使うな」とあ…

銀座Railsで「Railsアプリの設計」というタイトルで発表しました #ginzarails

12/13(金)にあった銀座Rails#16で登壇しました。 スライド speakerdeck.com 話したかったこと 1〜3年目のRailsエンジニアに参考になる話がしたい 7年やって私が覚えたことは、たぶん何かしら参考になるだろう 来週の仕事ですぐ参考になる話がしたかった 懇親…

ActiveRecord::Base.unscope の呼び出しでネストが深くなっているのを浅くする

仕事で見かけたコードを汎用化した内容にして、個人ブログにメモっておく。*1 多段ネストを reverse して Proc でラップしたり、それを RSpec で検証する方法はブログ書いてないと忘れる自信がある。 モデルの定義 class User < ApplicationRecord default_s…

2019年11月現在のRailsのissueに関するメモ #heiseirb

平成.rb #10 でRailsのissueに取り組むきっかけが分からない人向けのメモです。 個人的に気になっているissueについて簡単にまとめました。 注意)特に初心者向けとかではありません。 STI と has_secure_password の組合せで、親クラスでvalidationsを切り…

Railsアプリの開発環境を速くするための調査 その1 - gemの読み込み時間

その1って書いたけど、続くかは不明。 今回は使っているgemの読み込み時間を測ってみた。 Benchmark を仕込む config/application.rb でgemを読み込む前に Kernel.require を上書きして、計測する。 +require 'benchmark' +$result = {} +Kernel.singleton_c…

Rails の issue を解決するまでの手順とOSS初心者でもできること

突然ですが、あなたはRailsのissueとプルリクがいくつあるかご存知でしょうか? 2019年10月17日現在、それぞれ issue 384 / PR 803 になります。 多いですよね...。 個人的に、最近このissueを減らすのを少しでも手伝えないものかとissueにコメントしてみた…

ActiveRecordのissueで再現コードを書くときに発行されたSQLを確認する方法

rails/rails#36895 の挙動を確認してみようかなーと思ったけど、発行されるSQLを確認する方法が分からなかったので調べた。 Rails本体のテストコードだと assert_no_queries が使えるけど、これは外で使えないので。 動いたコード assert_no_queriesの定義さ…

Railsのissueに書いてある再現コードを使ってgit bisectする方法

備忘録。 具体的な例 先日に登録されたissueを例にしてみる。 github.com 再現コードを少し書き換える v5.2.3と6.0.0.rc2でsqlite3の依存周りでエラーが出たので、Gemfileのあたりを少しだけ弄った。 # frozen_string_literal: true require "bundler/inline…

minitestで書かれたActiveRecordのテストで特定のケースだけを実行する方法

追記: activerecord/RUNNING_UNIT_TESTS に書いてあった。 自分用の備忘録。 特定のファイルを実行する方法 $ cd activerecord $ ARCONN=postgresql ruby \ -I"lib:test" \ test/cases/adapters/postgresql/range_test.rb 特定のテストケースを実行する方法 …

ActiveRecordでRails.cacheを良い感じに使うgemを作った

作ったgemはこれです。 github.com 使い方 ApplicationRecord でモジュールを include してください。 class ApplicationRecord < ActiveRecord::Base include ActiveRecordInCache::Methods self.abstract_class = true end 自動的に maximum(:updated_at) …

RailsアプリでElasticsearchを扱うならchewyがおすすめ

Twitterでツイートしたり、表参道.rbの懇親会では紹介していたけど、ブログに書いていなかったので今更ながらまとめておきます。 github.com Chewyの利点 READMEを一通り読んでもらうと 最高に便利なのが分かる とは思うのですが、それだと身も蓋もないので…

Railsアプリでrakeタスクのログを見やすくする

rakeタスクのログを調べやすくするために、ActiveSupport::TaggedLoggingを使って読みやすくする方法のメモ。 # lib/rake_logger_rails.rb module RakeLoggerRails # rakeタスクでログを出力するとき、自動的にタグ付けを行います。 # # task foo: :environm…

「現場で使えるRuby on Rails5速習実践ガイド」の感想 #現場rails

なかなか読む時間が取れなくて積み本になっていたのを週末に読んだので、その感想です。 現場で使える Ruby on Rails 5速習実践ガイド(特典PDF付き)作者: 大場寧子,松本拓也,櫻井達生,小田井優,大塚隆弘,依光奏江,銭神裕宜,小芝美由紀出版社/メーカー: マイ…

表参道.rb で「毎日gemをアップグレードする生活」のタイトルでLTした #omotesandorb

omotesandorb.connpass.com 忙しくて2ヶ月くらい表参道.rbに行けてなかったけど、今回は参加できた。 今回の会場は外苑前の株式会社ビジネスバンクグループさんで、懇親会の時に軽食の提供があった。 ありがとうございます。 LT資料 毎日gemをアップグレード…

RuboCopの新しいルールを追加する方法(Custom Copの作り方)

何度もレビューで指摘することはRuboCopのルールとして追加して、自動化しておくと便利です。 この記事では、RuboCopで新しいルールを作る方法を紹介します。 参考にしたページ これがとても参考になった。 github.com Copの書き方は独特なので、RuboCopリポ…

ActiveRecord の where.not とド・モルガンの法則

where.not を使っていて遭遇した問題についてrailsdmの懇親会で話していたら、@kamipo さんから「5.2では少し直っている」という情報を頂いた。 この話をしているときに思ったけど、今の where.not の問題点について知らない人も多そうなので、せっかくなの…

Railsアプリの育て方という発表をしました #railsdm

Rails Developers Meetup 2018 Day 1で「Railsアプリの育て方」という発表をしました。 railsdm.github.io 発表資料 余談 本当は4月から放送されるシュタインズゲートゼロみたいな流れにしたかったけど、ちょっと上手く話の流れを作れなかったので、今回は普…

Step-to-Rails-Expert.rb#17 に参加した #StepRailsEx

ToDo アプリを題材にして、参加者で相互レビューする勉強会。 step-to-rails-expert-rb.connpass.com コード持ち込んだ 今までサボっていたので、今回は課題を解いて持ち込んでみた。 github.com Ruby/Rails のアップグレードなどが含まれている関係で、変更…

AWS EC2 上に Rails の開発環境を構築する

Rails アプリの開発環境じゃなくて、 rails/rails にプルリクを送るための開発環境を作る方法です。 rails-dev-box について Rails には Contributing to Ruby on Rails guide というドキュメントがあり、 誰でも簡単に開発環境を作ることができます。 5.1.1…

Rails の Issue とプルリクを毎日読むと勉強になる

最近やっているけど、これ良い勉強になっているのでブログで紹介する。 読むようになったきっかけ 先月、永和システムマネジメントさんのOSSパッチ会に参加しました。 agile.esm.co.jp この会の懇親会では Rails の Issue やプルリクの話題が多く出ました。 …

Rails 5.2 の Credentials を各環境でも使えるようにする gem を作りました

Rails 5.2 で追加される Credentials 機能を development, test, staging などで使えるようにする gem を作ったので紹介します。 github.com Rails 5.2 の Credentials とは? API token やパスワードなどの情報を暗号化し、リポジトリで管理できるようにす…

「Randomly Failing Specs」という内容でLTしました #railsdm

資料は Slide Share で公開しています。 Randomly Failing Specs from sinsoku listy www.slideshare.net 話したかったこと 時間切れで全く話せていませんでしたが、本当は「 sleep 使わずに直しましょう」って事が伝えたかった。 資料の作り方や発表内容で…

Rails クイズ: 次のコードで rollback されるのはどれでしょう?

先日、仕事のコードで遭遇して「なんだこの動き...」と思ったので、ブログに書いておく。 Rails クイズ: 次のコードで rollback されるのはどれでしょう?(配点10点) 常にバリデーションエラーになるモデル Bomb と no 属性によってコールバックを制御できる…