Ruby関連のことを調べてみた2022年11月19日

Ruby関連のことを調べてみた2022年11月19日

AlmaLinux OS 9にRuby 3.1をインストール(AppStream)

# はじめに

Application Stream(AppStream)を利用してAlmaLinux OS 9にRuby3.1をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2025-03がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

9.0系で出たプロダクトはモジュールではなかったが、9.1系で出たプロダクトはモジュールの模様

“`shell-session
# cat /etc/redhat-release
AlmaLinux release 9.1 (Lime Lynx)

# yum module list ruby
Last metadata ex

元記事を表示

AlmaLinux OS 9にNodejs 18をインストール(AppStream)

# はじめに

Application Stream(AppStream)を利用してAlmaLinux OS 9にNodejs 18をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2025-04がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

9.0系で出たプロダクトはモジュールではなかったが、9.1系で出たプロダクトはモジュールの模様

“`shell-session
# cat /etc/redhat-release
AlmaLinux release 9.1 (Lime Lynx)

# yum module list nodejs
Last metadat

元記事を表示

AlmaLinux OS 8にRuby 3.1をインストール(AppStream)

# はじめに

Application Stream(AppStream)を利用してAlmaLinux OS 8にRuby 3.1をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2025-03がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

“`shell-session
# cat /etc/redhat-release
AlmaLinux release 8.7 (Stone Smilodon)

# yum module install -y ruby:3.1
… 略
“`

### 各種確認

“`shell-session
# which rub

元記事を表示

文字列や配列等のオブジェクト内が空かどうか確かめるためのメソッド

# はじめに
文字列や配列を格納している変数の中に、要素が存在しているか確認するケースがあります。
それをまとめたいと思います。

## メソッド名とそれぞれの機能
nil?メソッド
変数の値がnilまたは、値なしの場合、真となります。

empty?メソッド
変数の値が””(文字列の場合)や値が空白の場合、真となります。

nil?との違いは、empty?は変数の値はあることはあるが、その値が空を示している、という点です。

blank?メソッド
nil?が真となる場合、または、empty?が真となる場合に、blank?は真となります。
簡単に言えば、blank?は値といえるものがない場合、真となります。

present?メソッド
blank?とは全く逆の動作をします。present?は、値といえるものがある場合、真となります。

元記事を表示

DockerでRailsの開発環境構築するときに、今のところ安定している設定(M1 Mac)

最近、RailsのDocker開発環境をチューニングしたので、備忘録です。

# 構成
## 基本
– M1 Mac
– Ruby 3.1.2
– Rails 7.0.4
– Node 16系
– Postgresql

## その他
– webpacker(Rails7から引退したみたいなので、そのうち剥がしたい)
– solargraphもdocker
– rubocopもdockerにしたいけどしてない。

## 説明
こちらの記事を見て、volume に gem をインストールするよう bundler に設定しました。
https://zenn.dev/aldagram_tech/articles/110bc79925d41b

bundle install前に設定
`bundle config set –local path /usr/local/bundle`

docker-compose.yml
`bundle:/usr/local/bundle`

## ファイル

### Dockerfile

“`dockerfile: Dockerfile
FROM r

元記事を表示

【Rails】RspecのFormオブジェクトモデル単体テストコードのエラー

# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 前提
Formオブジェクトクラスを作成して、モデル単体のテストコードの実装を行なっていました。具体的のスクールの課題でメルカリのコピーアプリのようなものを作成していた中で、今回のテストコードの実装がありました。

# 概要
商品購入機能を実装し、購入するにあたって、
「クレジットカード情報」
カード情報、有効期限、セキュリティコード
「配送先情報」
“`create_addresses.rb
class CreateAddresses < ActiveRecord::Migration[6.0] def change create_table :addresses do |t| t.string :post_code, null:fals

元記事を表示

【RUBY】if,elseを用いたプログラム

# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 指定された2つの真偽値によって処理が異なるプログラムを実装していきます。
平日と休日によって、「その日が遅くまで寝ていられるかどうか」を判断する、sleep_inメソッドとして、真偽値によって処理が異なることを実装します。

# 第一引数の値では「平日かどうか」、第二引数の値では「休暇かどうか」をtrueまたはfalseを用いて以下のように表します。
第一引数がtrue(平日である)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がfalse(平日でない)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がtrue(平日である)または、第二引数がfalse(休暇でない)の場合はfalseと出力。
第一引数がfalse(平日でない)または、第二引数がf

元記事を表示

【Rails】バリデーションのカスタムコンテキストon:を複数同時に指定したい場合の方法と仕組み

Railsでは、`on:`を使うことで、バリデーション実行タイミングを指定できたり、カスタムコンテキストとして実行するかしないかを調整できます。

https://railsguides.jp/active_record_validations.html#on

`on:`で定義したカスタムコンテキストを`valid?`等の引数に渡すことでバリデーションのチェックができます。
Railsガイドでは`valid?(:xxx)`の使い方が載っていますが、一度にカスタムコンテキストを複数指定する方法を書いておきたいと思います。

## 結論

結論としては、配列で指定してあげれば良いです。

“`ruby:controller
def create
book.valid?([:xxx, :yyy])

end
“`

“`ruby:book.rb
with_options on: :xxx do
validates :title, presence: true
…略
end

with_options on: :yyy do
validates :cont

元記事を表示

Rails 【where】日付・時間を範囲指定する際の注意点

## 行いたいこと
– where句を使用し、モデルのdeadline_onカラムから期日が近いデータを取り出したい。

## 完成形のコード
“`
model.where(deadline_on: Date.today..Time.now.end_of_day + (2.days))
“`

## 元々書いていたコード
“`
model.where(deadline_on: Time.now.end_of_day + (2.days)..Date.today)
“`
## 沼ったポイント
– 上記の元々書いていたコードでirb上でSQL文を確認していた際、BETWEEN節があったため問題ないと考えていた。
– 実際には、完成形のコードのように日時が早いものを先に後のものを後ろに記載しないと○日~○日までというような範囲指定はされないので注意が必要。

元記事を表示

【Ruby】Setクラス(集合)の扱い方

本記事ではSetクラスの性質や使い方について記述します。

## Setオブジェクトを作成

Setオブジェクトを作成するには、`Enumerable`モジュールの`#to_set`を呼ぶか`Set.new`を使用します。

`Set.new`で渡せる引数は`Enumerable`です。

### 空のSetオブジェクトを作成する
Setオブジェクトを生成するには、`Set.new()`を使用します。

“`ruby
> s = Set.new
=> #
“`

### 配列からSetオブジェクトを作成する
配列のような`Enumerable`なオブジェクトを `Set.new()`に渡してSetオブジェクトを生成することができます。 この際、重複した要素は削除されます。

“`ruby
> s2 = Set.new([1, 3, 5, 5])
=> #
> s2 = Set.new(1..3)
=> #
“`

`Enumerable`には `to_set()`メソッドが用意されているので、これ

元記事を表示

再帰関数を使って階乗を求めるメソッドを作成する(Ruby)

# 初めに

アルゴリズムを利用した方法で再帰関数がよく使われるので
階乗を求める再帰関数を作成して理解を深めます。

# そもそも再帰関数とは?

アルゴリズムなどを記述するときに、
自分自身を引用する形で定義することを**再帰的定義**といい
自分自身を呼び出す関数のことを**再帰関数**といいます。

# 再帰関数で注意すること

:::note info
1:自分自身の関数を用いて、問題を少し簡単にするための計算式をたてます
:::
:::note warn
2:無限ループにならないように**ベースケース**を作成します。
:::
階乗を求める関数factorialを作成してみましょう。
# 階乗(factorial)を求めるメソッド
“`ruby:ruby
def factorial(n)
if n <= 0 # 0! = 1 なので1を返します。(※ここがベースケース) return 1 else #※1:動作確認用 p n #※2:ここでfactorial自身を呼び出します return n * factorial(

元記事を表示

Basic認証

# ユーザー認証を導入

## 開発環境で環境変数を設定
※macOSがCatalina以降の場合

たとえば

「xxxx」というユーザー名と
「0000」というパスワードにて、設定をする場合。

##### ①ターミナルで以下を実行する
“`Terminal:ターミナル
vim ~/.zshrc
“`
すると、「~」が縦に大量に表示される。

##### ②「i」を押下し「インサートモード」にする
「– INSERT –」と最下部に表示される。

##### ③zshの内部に、以下の記述を追加
“`Terminal:ターミナル
export BASIC_AUTH_USER=’xxxx’
export BASIC_AUTH_PASSWORD=’0000′
~
~
~
~
— INSERT —
“`

##### ④インサートモードを終了
「escキー」→ 「:wq」→「Enterキー」を押して終了。

##### ⑤sourceコマンドを実行
“`Terminal:ターミナル
source ~/.bash_profile
“`

#

元記事を表示

【Ruby on Rails】デプロイ手順

#### Gemを追加

“`Ruby:Gemfile
group :production do
gem ‘pg’
end
“`
“`Terminal:ターミナル
bundle install
“`

#### デプロイ用の設定ファイルを追加
① binフォルダに、render-build.shという名称でファイルを新規作成する。
② 作成したファイルに、以下の記述を追加する。
“`Ruby:bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
“`
#### database.ymlの設定を変更
このように変更することで、開発環境およびテスト環境ではMySQLが、本番環境ではPostgreSQLが使用されるようになる。
“`Ruby:config/databa

元記事を表示

プログラミング言語のバージョンアップ運用を検討してみた

## 背景

担当プロジェクトで使用している「Ruby」のバージョンがサポート終了(EOL)となることを受けて、バージョンアップのやっていき方を検討してみたため、記録としてメモを残します。

当初は、「バージョンアップをしなかった場合に起こりえるセキュリティリスク」を全て洗い出して検討しようとしていたが、それはあまりにも壮大な話であったため、リスク対応と対応する工数のバランスについてを検討した。

## 今回の結論

EOLになるからと言ってバージョンアップをするのではなく、CVE(脆弱性情報)として公表されたものの中で対応が必要な場合に対応することとした。

(参考)[cve.mitre.org](https://cve.mitre.org/)

そのような脆弱性情報のほとんどは大きなニュースとして回ってくることが多く、かつ社内の担当部署から情報収集・展開がなされる運用も出来ているため、このような結論に至った。

## 理由

理想でいうと、マイナーバージョンの安定版が出るたびに小まめにバージョンアップをしていくのがセキュリティ面から言うと理想的ではあるが、工数がかかるため、開発

元記事を表示

【正規表現】subとgsub

### sub
「substitute:代用する、代わりに使う」の「sub」
「変数.sub(/代用前/,”代用後”)」の形で使う。

“`ruby
irb(main):001:0> str = “おにぎりを食べる”
=> “おにぎりを食べる”

irb(main):002:0> str.sub(/おにぎり/,”ラーメン”)
=> “ラーメンを食べる”
“`
ただ、最初の一つしか入れ替わらない。

“`ruby
irb(main):001:0> str = “チャーシューおにぎりとツナマヨおにぎりを食べる”
=> “チャーシューおにぎりとツナマヨおにぎりを食べる”

irb(main):002:0> str.sub(/おにぎり/,”ラーメン”)
=> “チャーシューラーメンとツナマヨおにぎりを食べる”
“`

### gsub
「g」は「グローバルマッチ」の「g」
複数含まれていても入れ代わる。

“`ruby
irb(main):001:0> str = “チャーシューおにぎりとツナマヨおにぎりを食べる”
=> “チャーシューおにぎりとツナマヨおにぎりを食べる”

irb(

元記事を表示

Bullet Trainを始めよう?️

## Bullet Trainとは
[Bullet Train](https://github.com/bullet-train-co/bullet_train)とはRuby on Rails上で動くSaaSのフレームワークです([Jumpstart](https://jumpstartrails.com/)みたいなもの)。
つまり、Railsを拡張しているものなので、新規アプリを作った時点で以下の機能がもうすでについています。
1. Deviseを使ってのユーザー登録・認証
2. Sidekiq & Redisのバックエンド・ジョブの設定
3. Jbuilderを使ってのAPI自動生成
4. Webhookの自動生成

他にも機能がたくさんありますし、Pro版を買ったらStripeの決済処理の設定など、色んな便利なツールが使えます。
[公式サイト](https://bullettrain.co/)
Bullet Trainの作成者:[Andrew Culver氏](https://twitter.com/andrewculver)
[Discord](https://discord.

元記事を表示

管理者と顧客を分けてDeviseを導入

## 初めに
今回は管理者と顧客を分けてDeviseを導入していきたいと思います。
※実装前提としてDeviseを導入していること

## 管理者と顧客のモデル設定

管理者側がAdmin
“`
管理者用
$ rails g devise Admin
“`
今回顧客側がCustomer
“`
顧客用
$ rails g devise Customer
“`
これをそれぞれターミナルに打ち込みます。

## 次にcontrollerを管理者、顧客で作成
“`
管理者用
$ rails g devise:controllers admin
“`
“`
顧客用
$ rails g devise:controllers public
“`
これらをそれぞれ記述するとappのcontrollerの部分がadminとpublicそれぞれ作成され2つに分かれてくれます。

## viewページの方も作成

“`
管理者用
$ rails g devise:views admins
“`
“`
顧客用
$ rails g devise:views publics
“`
これ

元記事を表示

【RSpec】validate_uniqueness_ofでテストが落ちるときの対処

## 環境
Rails 6.1.3.1
ruby 2.7.1
mysql Ver 8.0.26

##

“`shoulda-matchers“`というGemを使ってテストを書くとき、下記のエラーでテストが通らない。

“`ruby
it { is_expected.to validate_uniqueness_of(:number) }
“`

“`
Expected Employee to validate that :number is unique, but this could not
be proved.
After taking the given Employee, whose :number is ‹0›, and saving it
as the existing record, then making a new Employee and setting its
:number to ‹0› as well, the matcher expected the new Employee to be
invalid, but it was valid in

元記事を表示

Rails7 ターボリンクスを無効にする

# 前提
トップページに遷移した時に、特定のデータから 14個抜き取りを行なって、表示するというコードを書いていたのですが、そのページに更新ボタンを設けたところ、トップページに遷移してから再度更新がかかってしまい、実質的に2度更新がかかっている状態で困っていました。

# 原因
ターボリンクスがAタグを監視して、自動更新を行なってしまっていると思ったため、ターボリンクスを無効にする方法を模索します。

# 問題点と解決
rails6ではapplication.jsにrequire(“turbolinks”).start()の記述があったため
これを無効にすれば、対応できたのですが、rails7にはそれがありませんでした。
代わりにimport “@hotwired/turbo-rails”という記述があり、これは怪しいなと思って調べていくと
詳しい内容は読み解けませんでしたが、Javascriptとの融合みたいなことが書いてあったので
怪しいと思ってコメントアウトしてみました。

“`Ruby:javascript/application.js
// import “@hotwire

元記事を表示

any?メソッド

# 下のコメントは勉強になります(感謝!)
# 実際にないインスタンスを抽出する
“`rb
irb(main):044:0> a = Model.where(“column LIKE ?”, “#{Date.today.year}-#{Date.today.month}%”)
Model Load (1.3ms) SELECT `models`.* FROM `models` WHERE (column LIKE ‘2022-11%’)
=> []
“`
### クラスは?
“`
irb(main):048:0> a.class
=> Model::ActiveRecord_Relation
“`
### 中身は空かどうか?
“`rb
irb(main):045:0> a.empty?
=> true
“`
# 訂正 配列の中身の有無を判断には“`empty?“`が最適(コメントより)
# any? (instance method Array#any?)

any? ->

元記事を表示

OTHERカテゴリの最新記事