前人未踏の領域へ WEB・インフラ・プログラミング全般編

フロントエンド、バックエンド、インフラ、言語など、アプリ開発、IOT以外の記録

Rails

Rails : bundle updateの前にdry-runしたい

課題 bundle updateコマンドを叩いてライブラリを更新したらエラーで動かなくなったので少しずつ進めることに。 じゃあ少しずつ進めるために、どのライブラリに新しいバージョンがあるのかを知るにはどうすればよいか。 対応 bundle outdated を使うと古くな…

Rails: "7月15日".to_date

内容 とあるエラー調査をしていたところ、入力された日付とは異なる日付で取り込まれている問題が発生していた。 入力されたデータは 7月15日 。指定した日付フォーマットとは異なる、何年かも分からない日本語書式である。 これを受け取ったコードではだい…

Rails: 条件付きfind

内容 特定のIDでテーブルからfind()を使ってレコード取得したいが、ついでに条件も指定したい。 対応 Whereを先に書いて、最後にfindをつける。 仮にBooksとテーブルがあり、statusがactiveなものだけ対象にしたい場合は以下のようになる。 book = Books.whe…

Stripe: API実行レシピ

RailsコンソールおよびRails内でコピペして使う用の実例サンプル集。 カスタマー カスタマーを取得する cus = Stripe::Customer.retrieve("cus_XxwqzgXcn1XXsk") サブスクリプション付き cus = Stripe::Customer.retrieve("cus_XxwqzgXcn1XXsk", {expand:'su…

Rails: Cronジョブ実行時にExecJSでエラー

課題 RailsのJobを実行する処理をcrontabに記述したがExecJSでJavaScriptの実行環境が見つからないとエラーになる。 bundler: failed to load command: bin/rails (bin/rails) ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https:…

Rails destroyがdependent: :destroy から呼ばれたかどうかを知るには

課題 あるテーブルがすべて削除されたタイミングで親のテーブルを削除したい。 これを子テーブルのモデル側でやろうとすると、そのモデルの after_destroy で、belongs_to 関連を持つ親テーブルを 削除することになる。 これは普通に上手くいくが、楽観的排…

ActiveModel::Serializer::Null with Hash

課題 gemを追加したところ、以下のようなエラーが出るようになった Rendered ActiveModel::Serializer::Null with Hash 対応 何が原因でこの状態になるのか分からなかったが、どうやら追加したライブラリ内で使用している依存ライブラリの名前と こちらでCon…

database.ymlの環境変数が読み込まれない

課題 DBのパスワードを設定したが環境変数が読み込まれない。stagingだと問題ないがproductionでエラーになる。 production: <<: *staging database: hoge_production host: <%= ENV['DB_HOST'] %> password: <%= ENV['DB_PASS'] %> 原因 自動生成させて設定したproduction用のパスワードの先頭に # が含まれていたため(><) </:>…

Rails whenever指定方法あれこれ

Wheneverとは Rails上でcronによる定期実行バッチの処理時間を管理するためのライブラリ。crontabに記述する内容をruby言語で書ける セットアップ $ gem install whenever $ bundle exec wheneverize . コマンド 用途 コマンド Cronを書き換えずに更新内容を…

ubuntuへのmysql2インストール時にエラーになる

課題 Railsの 5.2.4がリリースされたのでupdateしようとしたところ、mysql2のアップデートでエラーになった。 /usr/bin/ld: cannot find -lssl /usr/bin/ld: cannot find -lcrypto collect2: error: ld returned 1 exit status Makefile:260: recipe for tar…

RSpecで _before_last_saveのテストが上手く動作しない

課題 値が変更されていた場合にのみ実行されるようなテストを書いたが、FactoryBotでcreateしたオブジェクトに _before_last_saveにFactoryBotでセットしていない値がセットされていて、調べるとDBのデフォルト値だった。 原因 FactoryBotでcreateしたオブジ…

曜日付きで日付を表示する

課題 Rubyで現在の日付を曜日付きのJPフォーマット 2019年11月15日(金) で返したい。 どうするのがよいか。 結論 I18nにそのものが定義されてた。 I18n.l Date.today, format: :long => "2019年11月15日(金)" フォーマットは strftime に従っているので ja.y…

バリデーションを項目ごとに1つにしたい

課題 ある項目に対して数値チェックと存在チェックを行いたい。数値チェックがNGな時点で存在チェックを満たさないのは自明なので これをスキップしたい。どうするのが良いか。 対応 バリデーションがNGだった項目は errorsにaddされるので、その存在チェッ…

異なるカラム名のモデルに対するバリデーションをConcernで共通化したい

課題 バリデーションを共通化したい。Concernを使いたいがモデルごとに違う名前を割り当ててしまった。 カスタムバリデータは大げさなので使いたくない。どうすればよいか。 対応 ActiveRecordの has_attribute を使うと項目の有無をチェックしてくれるので…

RSpecでvalidates_dateの日付テストがうまくいかない

課題 当日の日付との比較を行う処理を validates_timeliness の on_or_before を使って記述しているが、RSpecにテストを記述する際に日付の固定がうまくできず( Timecop も travel_to もNG )、現在日時との比較になってしまう。 # 未来日の入力はエラーと…

LinuxベースのDockerからMySQL 8.0に接続するための記述

課題 MySQL8にDocker上に構築したRailsからアクセスしようとしたら以下のようなエラーが発生して接続できなかった。 Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open…

schema.rbが実行エラーになる

課題 MySQLの生成カラムを使ったテーブル定義を行ったところ、構文内に含まれる文字列が schema.rbでエスケープされ、SQL実行時にエラーとなってしまう。 やりたかったこと(例) 年と月のカラムがあるのでdate型の生成カラムを作ってみた。 ALTER TABLE t1 …

オブジェクトの配列から文字列の配列を作る

課題 Rubyでこんな感じのオブジェクト配列があったとする。 "tags": [ { "id": 7, "name": "tag1" }, { "id": 8, "name": "tag2" }, { "id": 9, "name": "tag3" } ], これをStringの配列で返却したい。 "tags": [ "tag1", "tag2", "tag3" ] 対応 collectを使…

/* Responsive: yes */