コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Ruby

factory bot の trait内に引数のように値を渡したい場合はtransientを使う

N:Nの関連性のレコードをサッとつくるためのtraitを作りたい場合のtips 環境 Gemfile.lockは以下のような環境 factory_bot (6.4.4) activesupport (>= 5.0.0) factory_bot_rails (6.4.2) factory_bot (~> 6.4) railties (>= 5.0.0) 使い方 factory_botでは一…

Rubyで例外のキャッチをワンライナーで書くこともできる

あんまり書く機会がないのでメモ 環境 ruby -v ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin22] 構文 公式ドキュメント曰く {{式1}} rescue {{式2}} の形式で書くことができ、以下と同義になる begin {{式1}} resuce {{式2}} end 公式ドキ…

rbenvでのバージョンを決めるのは環境変数RBENV_VERSIONが最優先、次点が.ruby-version

表題の通り。ドキュメントにわかりやすく記載がないので、各記述をよりあつめた話をドキュメントをもとにまとめる。 調査したバージョン $ rbenv -v rbenv 1.2.0-59-g0704e65 rbenvが利用するRubyのバージョンを決めるのはどの情報をもって決めるのか まずは…

Railsのconfigのgemでは、環境ごとのymlに分けた値はdeep mergeされている

当たり前なんですけど、部分的に切り取ると違和感があるので言葉でまとめる 環境 config (4.2.1) gemそのもののリポジトリは以下 rubyconfig/config: Easiest way to add multi-environment yaml settings to Rails, Sinatra, Pandrino and other Ruby proje…

Railsでsymbol表記のhttp status codeを数値に変換するときにはRack::Utils.status_codeを使うと変換できる

Rails上で render status: :not_found とかやっているが、この :not_found と 404 はどこなのか、という小ネタ。 確認した環境 $ bin/rails -v Rails 7.0.6 Railsのステータスコードのシンボル 一覧はRailsガイドにある。 レイアウトとレンダリング-2.2.13.4…

Rubyのnilではto_*** で変換できるのをざっとまとめる

Railsでparamsの値を処理するときによく使われるので、どういうものがあるかを一覧で整理する 参考元 class NilClass (Ruby 3.2 リファレンスマニュアル) 一覧 メソッド名 変換されるクラス 変換後の値 to_i Integer 0 to_s String "" (空文字) to_a Array […

Rubyのhashのメソッドmergeはキーがシンボルと文字列では別物として取り扱われるので気をつける

当たり前といえば当たり前の小ネタ 環境 $ rails -v Rails 7.0.6 $ ruby -v ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [arm64-darwin22] そもそもmergeとは hashのmergeメソッドは2つのハッシュを1つにまとめ、同じキー名のものをマージする。例えば…

RailsでViewのErrorを減らす場合にはぼっち演算子を活用する

日頃のコードレビューの言語化です。 前提 Ruby on Railsのバージョンとしては6ぐらいを想定しています viewの記述にはerbを想定しております。 よくあるケース 例えば下記のようなテーブル構成をしているModelがあるとする create_table "users", force: :c…

Rails ConsoleにはSandboxというオプションがある

知らなかったので備忘まで。ただし万能ではないので用法用量を守って正しくお使いください。 環境 $ rails -v Rails 7.0.6 $ ruby -v ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [arm64-darwin22] どういうものか Railsコンソールには --sandbox とい…

Rubyにてハッシュを用いたキーワード引数(**引数)を使いたくなった場合は本当のそれが必要かを一息おいて考えてほしい

ハッシュを用いたキーワード引数(アスタリスクを二重につける記法のもの)を使ってしまうことによるデメリットと代替案に関してまとめます。 今回扱うケースとRubyのバージョン 一息おいて考えてほしいケースのサンプルコードは以下 def put_english_text(*…

Rubyの引数の情報の渡り方(共有渡し)をざっくりまとめる

いまいちちゃんと理解していなかったので改めてまとめる 大前提としての値渡し、参照渡し プログラミング言語の引数の渡り方の話で出てくるフレーズなので説明としては簡素に記述するが 値渡しは呼び出し元の実数値(実引数の値)を呼び出した関数の引数(仮引…

Rubyのraiseはエラーの指定を省略すると直前の例外を再度raiseさせる

知らなかった仕様 検証した環境 $ ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19] 出典 例外を発生させます。第一の形式(引用注:raise のみの記述のこと)では直前の例外を再発生させます。 - 制御構造 (Ruby 3.1 リファレンス…

RubyのYARDにはRDocのような:nodoc:は存在しない

そもそもRDocの:nodoc:とは Rubyに標準的に備わっているドキュメント生成のライブラリRDocには:nodoc:というオプションがある。これはどういうものかはドキュメントに記載がある。 指定した要素をドキュメントに含めません。 - library rdoc (Ruby 3.1 リフ…

Rubyにてyield_self/thenを使って普通の戻り値をメソッドチェインのように使う

このエントリはRubyのAdventCalendar2021の13日目の記事です。 書き方として割と見かける事が多いので、こういう使い方もできるよという知識の一つとしてご紹介します。 環境 $ ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19] …

RubyのCSVクラスを使ってTSVを読み込む場合にダブルコーテーションの入っているものがあるときの対策

パースエラーになる、のでワークアラウンド的な対策 環境 $ ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19] やりたいこと 正常に変換できるケース 例えば以下のような test1.tsv があるとする(タブはHTMLの表現上うまく出ないの…

RubyのURIクラスを使ってハッシュをクエリ文字列にする、URLからクエリ文字列をハッシュ化する

あんまり直球な情報がないのでメモがてら 環境 $ ruby -v ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19] やり方 URLからハッシュ化 target_url_with_query = "https://example.com?equal_string=ZXhhbXBsZXNleG1hcGxlcw%3D%3D&exa…

RubyのCSVクラスでheaders:trueにするとき、空白文字列の扱いに気をつける

要因がわかれば自明だけどわかりづらい、自分の引いたバッドノウハウのメモ。 環境 ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19] どういうことか headerの文字列一致は空白も含めて行われる、そしてheaderの文字列が存在しな…

Rubyの生成されたインスタンスのクラスを調べるときはinstance_of?とkind_of?(is_a?)を使い分ける

エイリアスかと思ったら違うのでちゃんと記述する 環境 $ ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19] 概要 生成されたインスタンスのクラスを調べたいときは instance_of? を使う。継承元のクラスも含めて調べたいときは ki…

Rubyにおける ! を二重にした !! の使い所

エクスクラメーションマークの重ねがけ、二重のビックリマークなど、読み方が難しいやつ 環境 $ ruby -v ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux] 効能 明確に true か false にしたいシーンがあるときに ! をかけてtrueかfalseにしてか…

RubyのArrayなどでfirstは空ならnilを返すことがあるので、気をつけて使おう

Railsだけど、自分の体験した辛さを言語化するシリーズ 要約 messages.first.title とかやるとコケるので、ちゃんとこういうことを考慮した作りにして欲しい。 遭遇した事象 Railsのview上に以下のようなコードがあった <div class="title"> <div id="notifce_message">『<%= @messages.first.title %>』が</div></div>…

Rubyのsrtftimeにて月や日をゼロパディングしたくない場合はマイナスを使う

ゼロ埋め、いわゆるゼロパディングに関してこういう書きかたがあるとはあんまり知らなかったのでメモ 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17] 使い方 以下のように時間を設定する t = Time.new(2001,2,3,4,…

enumの日本語化を実現するgem「enum_help」

ほう、こんなものが…という既存プロジェクトに入ってたgemをメモるシリーズ 出典 GitHub - zmbacker/enum_help: Help ActiveRecord::Enum feature to work fine with I18n and simple_form. 環境 rails (5.0.2) enum_help (0.0.17) 効能 gemを入れたら confi…

Rubyのプログラムでは文字列リテラルはダブルコーテーションで統一したほうがいいのではないかという考え方

かの onkcop には以下のような設定がある # * 式展開したい場合に書き換えるのが面倒 # * 文章ではダブルクォートよりもシングルクォートの方が頻出する # ことから EnforcedStyle: double_quotes 推奨 Style/StringLiterals: EnforcedStyle: double_quotes …

Rubyのモジュールは大文字から始まる必要がある

当たり前の話だが忘れてた マニュアル曰く モジュールを定義します。モジュール名はアルファベットの大文字で始まる識別子です。- クラス/メソッドの定義 - モジュール定義 (Ruby 2.6.0) ありがちな話 Railsにて /tokusyu/201912/special みたいなことを素…

自然な言葉の時刻をparseするgem Chronic

wheneverの独特の書き方の元ネタ gem mojombo/chronic: Chronic is a pure Ruby natural language date parser. できること ActiveSupportとはひと味違った形で表現ができる。 基本は Chronic のクラスメソッド parse をつかってTimeクラスを生成する。 例え…

Gemfileのgemの取得先にGitを指定する場合、branchを指定することができる

雑なメモ やり方 基本のやりかた gitで書くときには以下のように書ける。 gem "rails", :git => "https://github.com/rails/rails.git" branchを加えるやり方 gem "rails", :git => "https://github.com/rails/rails.git", :branch => "6-0-stable" 補足 い…

「初回は生成処理、それ以降は生成処理の結果を返す」のような記述をRubyで簡便に行う

「毎度計算して求めたくないんだよね」というニーズに答える書き方。前書いた原理の逆引き的な応用編。 環境 書き方 ||= を使うことで二回目以降の実行を抑止できる 例 めちゃくちゃ重い処理 heavy_work があったとして、それを一回だけ実行して、それ以降は…

Rubyのぼっち演算子の英訳は lonely operator , 正式名称はsafe navigation operator

英語のコメットコメント書くときに困ったから調べた 出典元 Ruby 2.3.0 Released 上記の内容曰く A safe navigation operator (so-called lonely operator) &. と記載があるので、safe navigation operator が正式名称の様子。なおこれはNull条件演算子とい…

Rubyでパーセント記号を使って作れる配列とその種類

Ruby Style Guideに則っているとよく自動変換されちゃうあれ。 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18] 出典 リテラル (Ruby 2.6.0) - %記法 文字列を扱う%wと%W 配列の要素が全て文字列のものの場合に使う…

sidekiqをbundlerで実行するとき、RailsRoot以外のディレクトリで行う場合はオプション指定が必要

怒られたのでメモ 環境 sidekiq (5.0.0) 実例 下記のように書くとご丁寧にオプション付きで -r をつけろ と怒られる $ /home/washi/example_app/bin/bundle exec sidekiq 2019-09-04T00:10:14.527Z 26140 TID-gqpwpb3so INFO: =============================…