Ruby関連のことを調べてみた

Ruby関連のことを調べてみた
目次

Rubyで任意時刻のDatetimeインスタンスを作りたい/既存Datetimeインスタンスの値を変えたいときの便利な方法

例えば、2024-06-08 12:00:00を作りたい場合

“`
# 今日は2024-06-08の場合
Time.current.change(hour: 12)

# 今日は2024-06-08ではない場合
Time.zone.parse(‘2024-06-08 12:00:00’)
“`

Rails API公式
https://apidock.com/rails/DateTime/change

元記事を表示

to_iを用いたエラー回避術:nilは0が返る

## こんなエラーに遭遇したことはないでしょうか?
“`rb
## controller
@users = User.all

@users.each do |user|
birthday = user.birthday
age = Time.zone.today.year – birthday.year
end
“`
controllerで@usersというインスタンス変数を仮に定義したとします。
eachを回し、userのbirthday(date型)を呼び出します。

age(年齢)をTime.zone.today.year(現在の年)からbirthday.year(誕生年)で引きます。
(年齢の計算は厳密ではないので、そこは割愛します。)
このとき、birthday.yearの値がなければ、integer(数値型) – nilを引くことになりエラーが発生します。
“`bash
irb(main):008> 2024 – nil
(irb):8:in `-‘: nil can’t be coerced into Integer (TypeError)

2024 –

元記事を表示

Rubyの raise で例外をメッセージ付きで投げ直した時、その例外の new が第一引数を取れなくてもエラーにならないのはなぜか

tldr; `raise` の 第一引数に渡したオブジェクトの `exception` メソッドの挙動の違いによる。

# `raise` で例外をメッセージ付きで投げ直した時、その例外の `new` が第一引数を取れなくてもエラーにならない

イニシャライザとして引数を受け取らない `HogeError` 例外を定義する。

“`ruby
class HogeError < StandardError def initialize super('hoge error') end end ``` 以下は当然 `#` となる

“`ruby
#
begin
raise HogeError
rescue => e
p e
end
“`

`HogeError` のイニシャライザは引数を受け取らないので、以下のようにやると `ArgumentError` となる

“`ruby
#

元記事を表示

Dev ContainerでRuby on Railsの開発環境構築

# 概要
いつもHTMLやJavascriptばかりで
環境構築の必要な作業をやったことがなく
今回Ruby on Railsのチュートリアル用でDockerに
チャレンジしてみました。

# やったこと
## 拡張機能のインストール
本題はrailsの勉強なのでなるべく早く環境構築できるように
VSCodeの拡張機能であるDev Containerをインストール

## フォルダの作成
まずは作業用フォルダ
“`
sample_app
“`
を作成し移動します。
移動後
“`
.devcontainer
“`
フォルダを作成しそこにファイルを置いていきます。

## docker-compose.yml
チュートリアルで開発用のファイルは配布されているのですが
そこも今回は勉強を兼ねて自分で書いてみました。
その際色々調べてみたのですが
チュートリアルをするには過剰かなと思ったので必要そうな
ところだけピックアップしました。

“`docker-compose.yml
version: ‘3’

services:
web:
build:
conte

元記事を表示

謎の挙動をするFactoryBotの作り方

しょーもなく、はたまたネタでもないですが、1時間弱苦しめられたので記す

# 事象

下記コードを実行したときに、`user_id`と`group_id`は同じIDになる想定だったが、なぜか違う値になり混乱していました(変数名は適当なんで気にしないでください)

“`ruby
create(:table_name, user_id: user.id, group_id: user.id, other_group_id: other_group.id)
“`

しかも面白いことに、`group_id: ‘xxx’`と入れてもそれは反映されず、なぜか数値が返ってきます。はて??????

# 調査内容

## コードをデバッグ

とりあえずprintデバッグを進めると、`other_group.id`の値がでていることがわかりました(?)

はて???????

## DDLを調べる

テーブル構造が間違えているのでは?と思い調べましたが大丈夫でした。はて?

## モデルを調べてみる

あーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

元記事を表示

【Rails】formオブジェクトでForbiddenAttributesErrorが起こる原因と対処方法

## はじめに
formクラスにparamsを渡してsuperで初期化しようとした際にActiveModel::ForbiddenAttributesErrorになる原因をこの記事で解明していこうと思います。

## 忙しい人向けの結論
paramsに対して`.permit`していないからです。
formクラスにparamsを渡す前に、controller側でparams.permit(:〇〇)とするとエラーが起きなくなります。
よければその理由を以下の文章を通してより深く理解してみてください!

## なぜForbiddenAttributesErrorになるのか?

### コード例
コード例は以下のような状況を基に作成されています。
– 醤油ラーメンを注文しようとしている
– このラーメン屋では、醤油ラーメンと豚骨ラーメンしか売っていない
– 醤油ラーメン・豚骨ラーメン以外の注文が来ないようにバリデーションをかけたい

“`
# 醤油ラーメンの注文がparametersで飛んでくる
#“醤油”} p

元記事を表示

Slackのfiles.getUploadURLExternalでどハマりした

Slackから「files.uploadなくなるよー」って連絡が来たので「API変えればいいんでしょ?よゆーっす。」と思って対応したらえらい大変だったので誰かのお役に立てばと思い投稿しました。

最終的なコードは[正解のコード](https://qiita.com/drafts/54ac70fa3031fa470e40/edit#%E6%AD%A3%E8%A7%A3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89)セクションにありますので、細かいことはいいから答えだけ知りたい方はそちらを見てください。

以下、コードはRubyです。

# Gemアップデートすればいいじゃん

そうです。Rubyにもslack-ruby-clientというGemがあるので、こちらのバージョンを上げれば対応出来るのですが、私の環境ではGemの依存関係的にslack-ruby-clientのバージョンを上げることができなかったので、自分でなんとかすることにしました。

# 新しいAPIについて調べた

files.getUploadURLExternalでググれば↓のような記事はた

元記事を表示

windows11にrubyをインストールしてVSCodeのターミナルに認識させる

## 初めに

後輩のwindowsPCにrubyを導入することになった。
元々macでしかrubyを触っていなかったのでサポートすることに。
意外と凡ミス箇所があったので備忘録に残す。

## rubyをインストール
Ruby Installerからrubyをインストール。
https://rubyinstaller.org/downloads/

WITH DEVKITの最新バージョンを選択。
(devkit、windowsの環境は必要らしい)

ダウウンロードしたものは基本
全てacceptかapproveを選択。ディレクトリもいじらなくていい。

進めていくとcmdに飛ぶ

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333537303132372f36646234313833302d336263622d386132322d383231342d6462623366383938323

元記事を表示

image_tag が本番環境で使えない

# はじめてのデプロイ
いよいよフェーズ1のデプロイ!
コマンドをちょこちょこ打って終わった!と思ったらエラーが起きた!
けど解決したのでまとめます。

# image_tagは使えない?
<%= image_tag %>を使用して画像を表示させていたものの、本番環境ではエラーが起きました。
問題の記述はこちら↓
“`top.html.erb
<%= image_tag "go_out_planning_logo.png", size: "250x250", class: "rounded-circle mx-auto mb-3 d-block" %>
“`
これを本番環境用に修正すると…
“`top.html.erb
<%= image_tag asset_path('go_out_planning_logo.png', :alt => ‘画像’), class: “rounded-circle mx-auto mb-3 d-block” %>
“`

となり、無事に表示させることに成功しました!

# 参照記事
こちらを参考にさせていただきました。

https://t-s

元記事を表示

業務的な部分もRuboCopに警告させる

[RuboCop]:https://github.com/rubocop/rubocop
[rubocop]:https://github.com/rubocop/rubocop

Ruby による開発で、静的にコードをチェックして書き方を強制させる [RuboCop] はみんな使ってると思う。 RuboCop がデフォルトで提供しているコップ(RuboCopの世界観では各リンターをこう呼ぶ)は割と簡単に作ることが出来るので、プロジェクトごとの決まりごとや業務的な部分をチェックするコップを作ってチェックさせることができる。

# たとえば

すべてのコントローラで、あるヘッダをつけたりつけなかったりしたい。ヘッダをつけるかつけないかはそれぞれの箇所で開発者による判断が必要。

あるヘッダを `X-foo` としたとき、こんなモジュールを用意して

“`ruby
module FooHeader
def set_foo_header
headers[‘X-foo’] = ‘foo’
end
end
“`

コールバックでセットしたり

“`ruby
class Ho

元記事を表示

わたしの頭の中のRubyとJavaScript

RubyとJavaScriptの学習を進めているうちに

『そもそも、Rubyってなんだっけ❓』 『JavaScriptとなにが違うの❓』
という疑問が湧き出てきたので、アウトプット用として記事を作成しました。

# RubyとJavaScript

まず、プログラミング言語には2種類あります。
**コンパイル言語**と**インタプリンタ言語**。

簡潔にいうと、、、

**インタプリタ言語**(Ruby・JavaScript・Pythonなど)は、コードを実行する際に1行ずつ機械語に翻訳していく言語。

**コンパイル言語**(Java・C++・Objective-C・Go・swiftなど)は、ソースコードを1行1行ではなく一括で機械語に翻訳して、実行していく方式の言語

引用元に私の同期の方がわかりやすく記事にまとめているので参考にして見てください!

引用元[:インタプリタ言語とコンパイル言語](https://qiita.com/Shinono/items/2f52d300f1b7b2f54b9a
)

現在学習中の言語、**Ruby**と**JavaScript

元記事を表示

AWS ECSにデプロイしたRailsが、特定のページでシャットダウンした際の対応まとめ。mini_racerのセグメンテーション違反

## 先に結論

JSランタイムのGemのmini_racerが何故かAWS ECS(Fargate)の環境下でセグメンテーション違反を起こし、Rails全体をクラッシュさせていた。
mini_racerを使わずに、nodejsを使うことで回避した。

## 症状
– 特定のページでいきなりPumaが落ちる
– AWSのECS環境でのみ落ちて、ローカルだと再現しない
– Fargate(Dockerコンテナ)を利用

## ログ
ログの最新はこのような記載…何が原因かもよくわからずにいきなりpumaが落ちていることが分かる。
“`
2024-06-03T08:14:48.983Z 7fbb3194d000-7fbb3194e000 r–p 00029000 103:00 567812 /lib/x86_64-linux-gnu/ld-2.31.so
2024-06-03T08:14:48.983Z 7fbb3194e000-7fbb3194f000 rw-p 0002a000 103:00 567812 /lib/x86_64-linux-gnu/ld-2.31.so
2

元記事を表示

RubyKaigi 2024で発表されたRSpecテストコード生成ツール Omochi についてまとめてみた

# はじめに
私は[株式会社エル・ティー・エス リンク](https://lts-link.com/)でRailsエンジニアをしているysk_ymdyと申します。
担当サービスは、IT人材と案件のマッチングプラットフォーム [アサインナビ](https://assign-navi.jp/)です。

先日「RubyKaigi 2024」に参加し、たくさんの学びや気づきを得ることができました。
その中でも@mikiko_bridgeさんさんが発表された Omochi というgemが、私含めRailsで開発するエンジニアにとって大変役立つものなのではと思い、共有させていただきます。

https://github.com/mikik0/omochi

# Omochiってどんなgem?
ひとことで言うと、RSpecを導入しているRailsアプリケーションに対して、LLMを使ってテストコードを自動生成してくれるgemです。

Railsで開発する際、テストコードの作成は手間がかかったり抜け漏れが気になっ

元記事を表示

【Rails/RSpec】Everyday Rails – RSpecによるRailsテスト入門の要約/感想

# はじめに
* 今回はRSpecの技術書である[Everyday Rails – RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)を読了したので、その要約と感想について書いていければと思います。

### RSpecとは?
* ruby用に開発された、テスト用の **フレームワーク** のことです。
* RSpecを用いることで、少ない記述で、可読性に優れたコードを簡単に記述することができます。

### 本記事の対象者
* railsのチュートリアルレベルを一通り学び終え、テストコードの学習を始めようと思っている方
* これから [Everyday Rails – RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp) を読む前に要点を掴んでおきたい方
* 実務でRSpecを使うことになり、キャッチアップの上で全体の概要を掴んでおきた方

を対象にこの記事を執筆しました。

ぜひ最後まで閲覧いただけると幸いです。

# よかったとこ

元記事を表示

credencialsに保存した数値とは違う数値が返ってくる問題

# TL;DR
Railsのcredentialsファイルに”0″や”0x”から始まる数字を設定すると、その値が取り出す際に異なる数字に変わってしまう問題が発生する。この原因はYAMLのフォーマットに由来しており、対策としては適切なエスケープを行う必要がある。

# 環境
Rails 7.1.3.2
ruby 3.3.0

# 何があったか
ある日、Railsのcredentialsファイルに次のような設定を行いました。

“`yaml
# credentials
service:
password: 01234
“`

その後、この値を渡しても何故か認証が通らない。
理由を探るために、Railsコンソール(IRB)でこの値を取り出すと、以下のような結果が得られました:

“`sh
irb(main)> Rails.application.credentials.service[:password]
=> 668
“`

### ・・・?

設定したpasswordの値は01234でしたが、取り出すと668という異なる値になっています。

# 原因
わかる人にはすぐ分かる

元記事を表示

プロセスって何?聞いたことあるけどよくわからない人へ

# はじめに
皆さんはプロセスについてどれくらい知っていますか?
業務で耳にすることはあっても、その実態が掴めずにいる方もいるのではないでしょうか?

私は2020年の4月に異業種からエンジニアへ転職して約4年ほどバックエンド開発に携わってきました。その中で、「プロセス」、「PID」、「プリフォーク」などのキーワードを耳にしましたが、雰囲気で理解している程度でした。

そんな時、PHPerKaigi2024で[「サーバーとは何かを理解して、コンテナ1つで実行しよう」](https://speakerdeck.com/sadnessojisan/sahatohahe-kawoli-jie-site-kontena1tuteshi-xing-siyou-phperkaigi2024)と言う登壇を拝見し、「プロセス?スレッド?よくわかんねぇけどもっと知りたい!」と思いました。そして、プロセスの解像度を上げる為に学習を決意しました。

その後、良い本を探していたところ[「なるほどUnixプロセス ― Rubyで学ぶUnixの基礎」](https://tatsu-zine.com/books

元記事を表示

[ruby初心者向け] rubyの単体テストってどうすればいいの? test-unit編

# 単体テストはどうすればいいの?
プログラミングを始めたてだと、書いたコードのテストが苦手だと感じる人が多いと思います。
1つ1つ確認するのは面倒くさいし、そもそもどうすればいいのか分からない人もいるはず…
そこでrubyの単体テストのやり方をまとめました!
# 結論
簡単に手早くするならtest-unitを使おう!!
# test-unitとは?
Rubyインストール時に一緒にインストールされる単体テスト用フレームワークです。
単体テスト用フレームワークを使うことでテストを自動化し、無駄な労力を減らすことができます。

# 単体テスト例
## test-unitで簡単なテスト
### テストコード
“`ruby is_odd_test.rb
require ‘test/unit’

#テストしたいメソッド
def is_odd?(n)
n % 2 == 1
end

#テスト用のクラス
class OddTest < Test::Unit::TestCase #テストメソッド def test_is_odd #検証メソッド # assert_

元記事を表示

バイナリーパッチ

リバースエンジニアリングのためにバイナリにパッチを当てるスクリプトをrubyで作ってみました。

“`ruby:binpatch.rb
#
# binary path for reverse engineering
#

argc = ARGV.size
if argc >= 4 && argc % 2 == 0 then
old = ARGV[0]
new = ARGV[1]
p = 2
bindata = File.binread(old)
while 2 + p <= argc offset = ARGV[p].hex inst = ARGV[p+1].hex bindata[offset] = (inst >> 24).chr
bindata[offset + 1] = ((inst >> 16) & 0xff).chr
bindata[offset + 2] = ((inst >> 8) & 0xff).chr
bindata[offset + 3] = (inst & 0xff).chr

元記事を表示

【ruby初心者向け】基本的な名前の書き方を知りたい!

# 名前をつける時の命名規則ってどれ使うんだっけ?
rubyのプログラミングの勉強を始めたての方だと、変数名や関数名などの命名をどうすればいいか分からない…命名規則って何???って思う人が多いと思います。僕もそうでした。

プログラミングで使われる一般的な命名規則は5種類あります。
– スネークケース
 アンダーバーで小文字の単語を繋げる
 例:example_test
– スクリーミングスネークケース
 アンダーバーで大文字の単語を繋げる
 例:EXAMPLE_TEST
– キャメルケース
– ローワーキャメルケース (キャメルケース)
 最初の単語の先頭を小文字に、2番目以降の単語の先頭を大文字にして繋げる
 例:exampleTest
– アッパーキャメルケース (パスカルケース)
 単語の先頭を大文字にして繋げる
 例:ExampleTest
– ケバブケース(ハイフンで小文字の単語を繋げる)
 例:example-test

うーん、どれを使えばいいか分からん…
パッと見て、そう思った人がいるはず…
なので、場合ごとの命名方法を1分で分かる

元記事を表示

enumerize が適用されているカラムに定義外の値が入るとデフォルト値固定になる

以下のように定義されている場合に

“`ruby
class User
enumerize :status, in: {
authorized: 1,
invalid: 2,
}, default: :authorized, scope: true
end
“`

以下のようにレコードを登録してみる。

“`
+—–+——–+
| id | status |
+—–+——–+
| 1 | 99 |
+—–+——–+
“`

このレコードを ActiveRecord を通して取得してみると

“`ruby
pry(main)> User.find(id: 1).status
=> “authorized”
“`

`authorized` として取得される。元の値を取得しようとしても

“`ruby
pry(main)> User.find(id: 1).status_before_type_cast
=> 1
“`

と `authorized` の値になっている。デフォルトが `au

元記事を表示

OTHERカテゴリの最新記事