動かざることバグの如し

近づきたいよ 君の理想に

rails

Rspecでバリデーションエラーのテスト書く時は細かく書け

今まで以下のように書いてたんだけど、これだと必ずしも想定していたバリデーションエラーによってテストが成功していたとは言えなかった。 expect(post).not_to be_valid バリデーションエラーをRspecで完全一致でテストする場合は以下 expect(post.errors.…

Rails独自の型をActiveModel::Type::Valueを継承して作成する

環境 Rails 7.1 やりたいこと Railsの ActiveModel::Attributesは本当に便利で ActiveRecordでもDBに紐づかないモデルのActiveModelでも重宝している ActiveModel::Attributes が最高すぎるんだよな。 #Rails - Qiita ただ標準で用意されている型の種類が少…

RailsでカラムAあるならカラムBとカラムCは入力必須とするバリデーション

環境 Rails7 やりたいこと Railsのモデルバリエーションで、カラムAがtrueのときにカラムBとカラムCは入力必須とするバリデーションを実装したい コード ifオプションやwith_optionsメソッドを使う class Model < ApplicationRecord # カラムAがtrueの場合の…

Railsでメール送信を1行で即時送信したい

環境 Rails 7 やりたいこと RailsのAction Mailerでメール送信を1行でサクッと送信したい コード ActionMailer::Base.mail(from: "sender@example.com", to: "recipient@example.com", subject: "Hello", body: "This is a test email").deliver_now このコ…

Railsで特定のレコードを先頭にしてソートする方法

環境 Rails 7 MySQL やりたいこと 例えばRailsのUsersモデルで10件レコードを取得し、emailが"hoge@example.com"のレコードを先頭にしたいみたいな状況 この場合はRubyで並び替えてもいいが、MySQLのORDER BYで特定のレコードのみを先頭にすることができる。…

RailsでCookieのSameSite属性を指定する方法

CookieのSameSite属性とは CookieのSameSite属性は、Webサイトのセキュリティを向上させるために導入された機能です。 SameSite属性を指定することで、Cookieがどのような場合に送信されるかを制御することができます。 SameSite属性には、以下の3つの値があ…

Railsで簡単にデバイス判定できるライブラリ「rack-user_agent」

やりたいこと Railsを使用して、user-agentからPCかスマホかを判断したり、OSやデバイス名を抽出したいと思っています。しかし、これらを自分で実装するのは手間がかかります。 そこで、「rack-user_agent」というライブラリを使用してみました。 k0kubun/ra…

Railsでmodelをフォルダ階層にしてきれいにする方法

環境 Rails 7 Railsのモデルディレクトリ荒れる問題 Railsはデフォルトだとapp/modelsにモデルファイルを生成する。 それはルールなので別にいいのだが、プロジェクトが成長するに従って10ならいいが50を超えてくるとかなりキツくなる。 そこでディレクトリ…

Railsで削除時にネストしたモデルも削除する

環境 Rails 6 やりたいこと Railsでは 1対多 とか 多対多 の関係のときに親レコードを削除したときにそれに紐づく子レコードも一緒に削除することができる。方法は簡単で has_many(has_one)にdependent: :destroyを追加するだけ ここで以下のようなparent>ch…

RspecでRaw post dataなPOSTを実行する

環境 Rails 5以降 経緯 そもそもRaw post dataとはなんぞや、から。 RailsでRequest Specを書く場合、当然POSTメソッドのテストも書くケースがある。 そんなときはこんな感じになると思う。 # spec/requests/logins_spec.rb require "rails_helper" RSpec.de…

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…