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

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

【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(

元記事を表示

Bsic認証

# ユーザー認証を導入

## 開発環境で環境変数を設定
※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? ->

元記事を表示

影響範囲の小さな小回りのきく管理画面ライブラリを作ってみた

[thoughtbot/administrate](https://github.com/thoughtbot/administrate) が有名ですが、これが厄介でした。管理画面の特にフォームのHTMLって結構デフォルトから変更しないと要件を満たせないやつがあるんですよね。**それでカスタマイズすると、いつの間にか本体の仕様が変わって見事にアップデートしにくくなりました。**

でも同時に、管理画面って共通化できる箇所がかなり多いというのも分かります。ライブラリを上手く利用できるならそうしたい。

この辺のもやもやをまとめるためにこれを作りました。

[cc-kawakami/micro-admin: A minimal Administration dashboard parts.](https://github.com/cc-kawakami/micro-admin)

中身は [trailblazer/cells](https://github.com/trailblazer/cells) です。なので、Rails に限らずいろんなところで使えます。

使い方は、まず `App

元記事を表示

小さなライブラリ群によるアプリでクリーンアーキテクチャをいい感じに理解する

クリーンアーキテクチャですが、[hanami/hanami: The web, with simplicity.](https://github.com/hanami/hanami) と出会ってから5周回くらいして、ようやく腹落ちしつつあるのでまとめてみます。

#### フレームワークを利用しつつ理解するのは難しい
フレームワークを利用した場合、例の図のUsecaseの外堀をグルッと埋める形になります。MVCならController、View、Modelです。Hanamiの場合はRepositoryが来ます。個人的にはこの内側から3層目が全て一体化していると、どうしてもそれらが中心であるように感じてしまうんですよね。

そこでアプリケーションのそれぞれの責務を別のライブラリを利用して実装することを試してみました。

これです。 [cc-kawakami/clean-architecture-minimal-app: A minimal Clean Architecture app](https://github.com/cc-kawakami/clean-architecture-m

元記事を表示

【個人開発】動物好き必見!動物とのふれあいに特化した検索サービス『FLUFF MAPS』を作りました!

![top3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253662/4ed74182-39f9-020b-a1bd-0959e9631f03.jpeg)

この度「動物とふれあうことができる施設を簡単に検索できるサービス【FLUFF MAPS】」をリリースしました!

__サービスURL__
https://www.fluff-maps.com

__GitHub__
https://github.com/kazuki1025okumura/fluff_navi

## はじめに
はじめまして![おくむら](https://twitter.com/kazuki_okumura)と申します。
私自身、動物が大好きでよく牧場や動物園にふれあいにいきます。

ネットでそういった施設を探していて、「条件を絞り込んで検索できたらな」だったり「ふれあうことができる動物が一覧で見れたらな」と感じていて、それなら自分で作ってしまおう!と思い製作しました。

## このアプリへの思い

元記事を表示

フレームグラフを読むのは簡単ではありません

フレームグラフを読むのは簡単ではありません。練習が必要です。ですが、ちょっとしたコツもあります。ここではそれを紹介します。

フレームグラフやウォーターフォールチャートを呼ばれる種類の可視化を見ないで1日を過ごすことは、ほとんどありません。大抵はSpeedscopeやChrome DevToolsで、そういった可視化を目にしています。

著書の多くやワークショップの中でフレームグラフの読み方を教えていると、そこでつまづく人を見かけます。フレームグラフを読んで理解するのは、ある程度はスキルの話です。スキルを身につけるには、絶え間ない練習が必要です。

ただ、フレームグラフを読むスキルはサブスキルに分解できます。その場合に最も重要だと私が考えるのは、「どのフレームが重要で意味があるのかを判断できる」スキルです。

プロセスは、Xミリ秒ごとに停止します。停止されると、プロセスの現在のスタックが記録されます。例えば、フレームAはフレームBを呼び、フレームBはフレームCを呼び出すといった具合です。念のために言っておくと、実行スタックとは、例外のバックトレースを見るときなどに表示されているもののこ

元記事を表示

正規表現とmatch,subメソッド

# はじめに
正規表現を用いた任意の文字列のチェック方法やその他できることをまとめる。

## matchとsubメソッドについて
### subメソッド
subメソッドは、文字列の指定した部分を別の文字列に置き換えるためのメソッドです。
第1引数に置き換えたい文字列を指定し、第2引数に変換後の文字列を指定します。また、操作したい文字列は/で囲みます。

【例】
irb(main):001:0> str = “りんごを食べる”
=> “りんごを食べる”

irb(main):002:0> str.sub(/りんご/,”みかん”)
=> “みかんを食べる”
「りんごを食べる」という文字列が「みかんを食べる」という文字列に置換されました。

### matchマッチ
matchメソッドは、引数に指定した文字列がメソッドを使用した文字列に含まれているか否かをチェックするためのメソッドです。含まれている場合は、指定した文字列がMatchDataというオブジェクトが戻り値で得られます。また、含まれていない場合は、戻り値としてnilが得られま

元記事を表示

OTHERカテゴリの最新記事