動かざることバグの如し

近づきたいよ 君の理想に

rails

1分でRailsにSidekiqを導入するまでの手順

環境 Rails 5.x 6でも同じ 4は知らん ruby 2.x 手順 早速やっていく ここでは localのRedisサーバーにSidekiqを使う 混合しがちだが、SidekiqのWorkerは使わずRailsのActiveJobでJobを走らせる。 Gemfileに以下を追加 gem "sidekiq" gem 'redis-namespace' …

お前らのf.radio_buttonとf.labelは間違っている

環境 Rails 5.2 経緯 Railsで生涯費用シミュレーターというのを作っていた。 で、form_withで作ったフォームの中にラジオボタンを作りたかったのだが、これがなかなかうまくできない 先にゴールの生成されるべきHTMLを示す。 <input type="radio" value="month" checked="checked" name="cost[pay_type]" id="cost_pay_type_month"> <label for="cost_pay_type_month">月額払い</label> ラジオボタンは地味に…

Railsでモデルのカラムのデフォルト値をセットする方法

データベースに記述する そもそもRails側でやらなくても、データベースにデフォルト値をセットする機能が備わっているのでそっちを使う。 マイグレーションで書くとこんな感じ create_table :posts do |t| t.string :name, default: "nanashi" t.timestamps …

FactoryBotでmethodカラムを定義するとエラーになる件

背景 Railsのテストには外せないライブラリと言っても過言ではないテストデータの生成管理用ライブラリことthoughtbot/factory_bot しかし、あるテストでいつもどおりにモデルのテストデータを書いてたらエラーになった。 FactoryBot.define do factory :hog…

RspecでRailsのRakeタスクをテストしたい人生だった

結論 テストすべきロジックはモデルとかに書くべきで、直接Rakeタスクをてすとしなきゃいけないってことは何かがおかしい が、一応メモ 環境 Rails 5.2 コード 先に全部ロードしておく RSpec.configure do |config| config.before(:suite) do Rails.applicat…

Railsで日付なしの内容だけのログを出力する方法

環境 Rails 5 やりたいこと 普通のログに吐くだけなら Rails.logger.info("メッセージ") で可能だが、先頭に日付のフォーマットが入ってしまったりしてしまう I, [2019-08-18T02:07:34.381971 #4116] INFO -- : Processing by VideosController#random as HT…

Rails+RspecでUser-AgentとかHeaderを書き換えてテストする方法

環境 Rails 5.2 Rspec 3.8 背景 Rspecのテストで、今まではController specsだったが、今ではRequest specsが推奨となっている。 request spec - Request specs - RSpec Rails - RSpec - Relish いわゆる type: :request というやつ で、Request specsでHead…

RailsとPumaでResource temporarily unavailableになってしまう対処法

眠いのでめもだけで許して Resource temporarily unavailable with default unix socket configuration · Issue #1449 · puma/puma

RailsでMySQLのストレージエンジンを指定する方法

環境 Rails 5.2 やりたいこと RailsのMySQLでMyISAMを使いたい。が、指定しないとInnoDBになってしまう。RailsだとマイグレーションスキーマのCreate tableに毎回書かなきゃいけなくて面倒。 かといってMySQL側でデフォルトでセットしようにも [mysqld] defa…

rails credentials:editをVSCode内でやりたい人生だった

動機 Rails5.2以降では秘匿情報はCredentialsで管理することが推奨されている。rails secrets:xxxxなんでなかったんや Rails 5.2の新機能Credentialsでパスワード等を管理する - 動かざることバグの如し で、結構 rails credentials:edit することが多いんだ…

Pumaより速い「Falcon」を試す

RubyKaigi 2019のスライドでちょっと話に出てたので初めて知った 試してみる Falconとは Railsに使うミドルウェアといえば、Unicorn、Pumaあたりが有名だが、falconはわりと新興である。 速さの秘訣は Unicorn マルチプロセスで(Webrickよりかは)速い Puma…

RSpecで現在時刻を変更してテストしたいときはtravel_toが便利

環境 rails 5.2 やりたいこと RSpecでいろいろテストを書いているのだが、日時が絡むテストが非常に面倒である。例えば一定時間経つと挙動が変わるとか、〜年より前、後で振る舞いが変わるテスト、など。 が、さすがRails、travel_toというヘルパーメソッド…

Railsでrakeタスク上からviewを生成(render)する方法

環境 Rails 4、5 やりたいこと railsのtasksからActionViewを参照してHTMLを生成(render)して出力したい ここでいうrenderがややこしいのだが、よくControllerの中で使っているrender json: {key: 1}などとは違う もっと言うと普段使っているrenderの内部…

Rails開発をもっと楽しくする便利メソッド集

この記事はRuby on Rails Advent Calendar 2018の7日目です。 はじめに 今回は知らなくても生きていけるけど、知っておいたほうがお得で便利なRailsメソッドを紹介していく。RailsといいつつActiveSupportやんけ squish 冒頭と末尾のホワイトスペースを削除…

RailsのActionMailerで差出人のメールアドレスを取得したい

環境 rails 5.x やりたいこと ActionMailerを使ったメール送信周りのテストをしていて、 # メール1通送れているか expect(ActionMailer::Base.deliveries.size).to eq(1) mail = ActionMailer::Base.deliveries.last expect(mail.subject).to eq("たいとる"…

Railsに「Honoka」なBootstrapをyarn経由でインストールする

Honokaというじゅりあん(@MITLicense)氏作のBootstrapテーマがある。 Honoka - 日本語も美しく表示できるBootstrapテーマ サンプルを見てもらうとわかるが、日本語の表示が綺麗になっている。加えて配色も標準と変わってて、Bootstrapの触り心地をキープしつ…

Railsで生SQL実行時にプレースホルダー付けてSQLインジェクション対策

環境 Rails 5 やりたいこと RailsでActiveRecordの生成するSQLではなく、生SQL実行したいときは以下のようにしてできる。 ActiveRecord::Base.connection.execute("select count(1) from users where date = '2018-10-20'") が、プレースホルダー機能を使お…

RailsでpumaのCPU使用率を取得する方法

環境 linuxでpumaで動作しているRails railsの負荷を計測するのは一筋縄ではいかず、一発でこうすれば取得できるってのはないのだが、なんとかして負荷度を計測したい。 ってときにtopコマンドでpumaのCPUの使用率を取得すると概算できることがわかったので…

Railsでルーティング一覧を生成してCSV出力する

環境 Rails 5以降 やりたいこと Railsは基本的には規則に沿ったルーティングになるが、規模が大きくなってくるといろいろ管理が辛くなってくる。今回ちょっと別のアプリにRailsのURL一覧を読み込ませる必要があったのだが、流石に手動で書くのはキツかったの…

Railsでrakeタスクから別のタスクを呼び出す

環境 Rails 5 やりたいこと Railsのtaskから別のタスクを実行したい。 方法 Railsのタスクはbundle exec rails xxx:xxxxのように実行するが、結局実態はただのrakeタスクなのでinvoke()を実行すれば良い namespace :sample do task hoge: :environment do |t…

rails db:migrateでALTER TABLEする時は気をつけろという話

結論 reversible do |direction| direction.up { execute "ALTER TABLE battles ADD PRIMARY KEY (id);" } end 環境 Rails 5.2 Ruby 2.4 なぜつけるのか railsのマイグレーションでindexつけたりとか特殊なことをしようとするときはexecute()を使うこともあ…

ActiveRecordのコネクションプーリングを完全に殺す

環境 Rails 5.2 MySQL コネクションプーリングとは 割愛 以下のサイトが詳しい Rails4.2のコネクションプールの実装を理解する - Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.) やり方 database.ymlにreaping_frequency: nil を追加するだけ def…

RailsのModelを動的に生成してDBに接続する方法

環境 Rails 5.1 やりたいこと 普通、RailsのModelはapp/model以下に予め記述するが、特殊な例で動的に生成させたい場合 最初はメタプログラミングでいけるやろって思ったけど、 > mymodel = Class.new(ApplicationRecord) => #<Class:0x007f8e422a3668> (call '#<Class:0x007f8e422a3668>.connection' to esta</class:0x007f8e422a3668></class:0x007f8e422a3668>…

ActionMailerのメール送信ログを出力する

久々のRailsネタ 今回やりたいのはActionMailer経由でのメール送信時に送信先のログを吐きたい。 ActionMailerにはObserverというトリガー?的な機能があるのでそれにhookする感じで まずはログ出力先の設定 config/application.rbに追記 config.mail_logger…

Rails 5.2の新機能Credentialsでパスワード等を管理する

環境 Rails 5.2 要点 今までのsecrets.yml および rails secrets:xxxx方法は非推奨 今後は rails credentials:edit で秘匿情報の編集ができる 暗号化されたファイルはconfig/credentials.yml.enc 複合キーはconfig/master.key もちろん.gitignoreされている…

RailsでURL生成するときに必ずhttpsにしたい

Railsで posts_url みたいにヘルパーを使ってルーティングからURLを生成する際、デフォルトだとhttpsならhttpsで、httpならhttpのURLになるが、 明示的にhttpsにさせたい場合、 <%= link_to 'りんくだよ', posts_url(protocol: 'https') %> でいける。 どう…

巨大レコードのkaminariページネーションは工夫が必要

railsネタです kaminariが重い kaminariとは言わずと知れたRubyのページネーションライブラリ。Railsとの親和性が非常に高く、ソースコードをちょちょっと弄るだけで難しいページネーションが作れる。 が、ページネーション対象のデータの件数が多いと(10…

RailsのflashメッセージをBootstrapで表示したい

Bootstrapではalertというクラスが用意されている。 <div class="alert alert-primary" role="alert"> This is a primary alert—check it out! </div> <div class="alert alert-secondary" role="alert"> This is a secondary alert—check it out! </div> <div class="alert alert-success" role="alert"> This is a success alert—check it …</div>

Railsで明示的にクッキーを削除する

毎回忘れるのでメモ cookies.delete :my_key, domain: 'example.com'

RailsのActionMailerでGmailからメール送信

環境 Rails 5 やること gmailのアカウント使ってSMTP経由でメール送信 もちろん無料 やらないこと ActiveJobによる非同期処理 Googleアカウント どうやらセキュリティ的に厳しくなったのか、Googleアカウントの2段階認証の設定をしていないと他人にメールが…