約束の地

キャロ組

プログラミング -> Ruby on Rails

Sidekiq-Cron で定期実行しようとしたら初回だけ実行されるが2回目以降が実行されずに4時間ハマった話

結論 gem のバージョンを以下のようにちゃんと指定しましょう。 gem 'sidekiq-cron', '~> 1.0.4'

Capistrano で whenever をデプロイしようとしたらドハマリした

前提 Capistrano だとか whenever だとかの固有名詞は本質的に関係ありません。 結論 config/schedule.rb の中に、シェルのコマンドに依存する記述を含めていたところ、ほぼまっさらなデプロイ先にデプロイしたらエラーが出た。 具体的には こちらの記事 の…

Rails の before_action を特定のアクションだけに適用したい場合

結論 only: という引数を追加する*1。 実例 class FoobarController < ApplicationController before_action :nanika_no_action, only: [:tokutei_no_action] (省略) end *1:配列

Slim で任意の属性を付与する

結論 Slim でこう書くと、 .col.s12 foo='bar' hoge='fuga' こういう HTML が生成されます <div class="col s12" foo="bar" hoge="fuga"></div>

Rails を Capistrano でデプロイした際に Puma が再起動できなくて 3時間 ハマった話

前提 詳しい説明は公式ドキュメントを参照するなどして下さい。投げやりですいません……*1。 環境 Ruby 2.5.3 Rails 5.2.1 Capistrano Version: 3.11.0 (Rake Version: 12.3.1) *1:あまりにハマりすぎて疲れてしまいました

Capistrano で Rails をデプロイするときに Yarn はシステムグローバルに入れなければいけないのか

背景 ndenv で入れた npm で yarn をユーザグローバルにインストールして*1、それをデプロイ時に用いたい。 結果 ダメっぽいです。どうしても /usr/bin/env を見に行ってしまいます。30分ほど調べましたがスマートな解決策は無いようなので、これ以上ハマっ…

Capistrano で Rails をデプロイしても一向に assets:precompile してくれない

結論 対象サーバの roles の設定中に web が含まれていないから。 参考(答え) 余談 こんなんで 2時間 近くハマってしまって悲しすぎる。

Capistrano で assets:precompile が通らないため 5時間 溶かした話

結論 デプロイの際に持ってくるブランチに対して全くプッシュしていなかったから。 つまり、ローカルでガシガシコミットしていてそのままデプロイしていたところ、引っ張ってくるファイルは何ら更新されていないため、ローカルファイルと差異が存在していて …

Rails でフォームを submit したときに URL に付与される commit=hogehoge を除外する

状況 フォームを submit した先の URL が例えば以下のようになった場合に、commit=hogehoge の部分を除外したい。 http://localhost:3000/pages/search?search_query=abcdefg&commit=hogehoge 結論 submit メソッドのオプションに name: nil を指定する。 Sl…

Rails の form_with で「utf8=✓」を消す

結論 form_with のオプションに skip_enforcing_utf8: true を指定する。 Slim での例 = form_with url: 'foobar', skip_enforcing_utf8: true do |f|

rails c した際に fileutils の警告が大量に出た場合

結論 以下の手順を踏みます。 $ gem uninstall fileutils $ gem update fileutils --default 以下のように返ってくれば OK です。 $ gem list | grep fileutils fileutils (default: 1.1.0, default: 1.0.2) これで rails c の際に冗長な警告が出なくなるで…

Rails に reCAPTCHA を導入する

結論 公式サイトで登録をする*1 reCAPTCHA の gem を入れる 環境変数に RECAPTCHA_SITE_KEY と RECAPTCHA_SECRET_KEY の値を設定する formタグ の中に <%= recaptcha_tags %> を挿入する 結果を得る 手順 1. 公式サイトで登録をする 特に難しいところはない…

Active Record で「子(「1対多」の「多」)」から「親(「1対多」の「1」)」のレコードを取得する

前提 アソシエーションは設定済みとします。 テーブル構成 以下のようなテーブル構成とします。User が「親(「1対多」の「1」)」で、Article が「子(「多対1」の「1」)」です。 User id name created_at updated_at Article id user_id content created_…

Sidekiq が原因で ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool となりメモリを食い潰す場合

結論 参考 現象の起こし方 この現象を起こすには、例えば sidekiq-scheduler を使って短い間隔に MySQL を叩きまくるスケジュールを組めば再現できるかと思います。

Rails (Action Mailer) で複数のファイルを添付する方法

結論 attachments*1 のキーと値を複数定義すればよいです。 実例 attachments['foo.txt'] = File.read('tmp/hello_world.txt') attachments['bar.txt'] = File.read('tmp/hello_ruby.txt') attachments['foobar.txt'] = File.read('tmp/hello_rails.txt') こ…

Rails で MySQL の Strict SQL Mode を無効にする方法

結論 config/database.yml に以下のように記述すればよいです。 development: adapter: mysql2 host: YOUR_HOST_NAME username: YOUR_USERNAME password: YOUR_PASSWORD database: YOUR_DATABASE strict: false

Rails (Active Record) の limit メソッド で nil を引数に指定すると limit は無視される

結論 つまり以下のとおりであるということです。 Product.all.limit(10).to_sql #=> "SELECT `products`.* FROM `products` LIMIT 10" Product.all.limit(nil).to_sql #=> "SELECT `products`.* FROM `products`"

Rails で redirect_to :back したら undefined method と怒られたとき

結論 Rails 5 の場合は redirect_back を使う。 答え

Rails の scope で nil を返す(返すように書く)と all が返る

結論 以下の記事をご覧下さい。 具体例 Product というモデルに foobar というスコープを以下のように定義したとします。 class Product < ApplicationRecord scope :foobar, -> { nil } end この scope を適用すると Product.all が返ります。 Product.foob…

whenever の runner で タスク(メソッド) に引数を与えるときにスマートに書く

前提 Foo.bar というメソッドが Time型 の引数を取ると仮定します。すなわち、Foo.bar(Time.now) みたいな感じです。 runner で書く whenever で runner を用いて書くと、上記のメソッドを実行する場合は例えば以下のようになるかと思います。 every '00 18 …

Rails で マイグレーション の履歴をすっ飛ばして スキーマ だけを適用させたい場合

結論 以下の手順をたどります。

Rails での タイムゾーン の設定

結論 config/application.rb に以下のように書いておけばよいでしょう。 config.time_zone = 'Asia/Tokyo' config.active_record.default_timezone = :utc

Twitter の REST API で得られる ツイートID や ユーザID を RDB に収めるときは bigint を使う

理由 ORDER BY で期待どおりの動作をしてくれないから*1*2。 Rails(Active Record)で bigint を使う Rails で予め用意している型に bigint はありません*3。したがって integer で定義した上で limit オプションを付与して明示的に bigint であることを指…

Rails の MySQL で Incorrect string value というエラーが出たとき

結論 文字コードの設定を見直す*1。 Rails では たとえば utf8mb4 の場合には、config/database.yml に明示的に encoding: utf8mb4 と書きましょう。 development: adapter: mysql2 host: YOUR_HOST encoding: utf8mb4 username: YOUR_USERNAME password: YO…

Rails (Active Record) で 外部制約(外部キー)を削除する

結論 remove_foreign_key を使えばいいです。 実例 class FooBarMigration< ActiveRecord::Migration[5.2] def change remove_foreign_key :users, :jobs end end 余談 ググったら外部制約のカラムそのものを削除する方法が多くヒットして大変でした*1。 *1:…

Rails のマイグレーションでエラーが出てハマったときに調べるところ

大原則 データベースを直接いじってはいけない。マイグレーション(ファイル)経由で変更する。

Rails で フォーム から submit された際に付与されるパラメータ「commit」を削除したい場合

結論 submit_tag にオプションで name: nil を付与する。 具体例 <%= submit_tag "foobar", name: nil %> form_for の場合はこんな感じになるかと思います*1。 <%= form_for @foo do |f| %> <%= f.submit '提出', name: nil %> 参考 *1:記述を一部省略

Rails の フォーム の パラメータ に付与される utf8=✓ を取り除く

結論 config/initializers/remove_utf8_enforcer_tag.rb みたいなファイルを作って、以下のように書きます*1。 module ActionView module Helpers module FormTagHelper def utf8_enforcer_tag ''.html_safe end end end end なぜ上記のようにするとよいのか…

Slim で .js.slim なファイルに JavaScript を書く方法

結論 以下のような感じで書きます。ファイル名は例えば foobar.js.slim みたいな感じです。 | (function() { | console.log('Hello, World!'); | console.log('Hello, foobar.js.slim!'); | }()); ……きつい*1。小規模のアプリでちょこちょこっと使うぐらいな…

Rails で digest認証 を行う際の before_action の指定

前提 Rails 5.2.0 です。 結論 before_action :digest_authenticate

Powered by はてなブログ