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

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

VSCodeのRuby LSPが Gem::MissingSpecErrorで立ち上がらないエラーがでた備忘録

## 読んで欲しい人

– Ruby LSPで下記に似たエラーが出た人

/Users/user/.rbenv/versions/3.3.4/lib/ruby/3.3.0/rubygems/dependency.rb:301:in `to_specs’: Could not find ‘sorbet-runtime’ (>= 0.5.10782) among 210 total gem(s) (Gem::MissingSpecError)
Checked in’GEM_PATH=/Users/user/.gem/ruby/3.3.0:/Users/user/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0′ , execute `gem env` for more information

Error starting the server: Pending response rejected since connection got disposed

– 過去の俺

## 問題発生までの経緯

– rbenvで最新Rubyバージョンをインストール:

元記事を表示

[Rails]stubを使うときは評価順序に気をつけた方がいいという話

# はじめに
皆さん`stub`は好きですか?私は正直嫌いです。しかし、外部と通信を行う機能を作成したりする時には切ってもきれない便利な機能です。今回はそんな機能を使うにあたって沼ったポイントがあったので共有していきます。

# 開発環境
– Ruby 3以上
– Ruby on Rails 6以上
– Minitest

# 最初に結論
`Object.new`を`stub`する際は、`.new`される前に引数が評価されるので注意が必要です。

これだけではわかりづらいと思うので、コードで例を見ながら解説します。

# ケーススタディ
以下のような外部とやり取りを行う、`GetterService`があったとします。外部通信を行うのは`GetterClient`なので、テストを行う際は`GetterClient.new`を`stub`することになります。
“` ruby
class GetterService < ServiceBase def call pp '1' data_list = getter_client.fetch_data_list

元記事を表示

Rspecにてcreated_atの検証で失敗する

# はじめに
RspecにてJSON形式のレスポンスデータを検証している際に、
`created_at`や`updated_at`にてデータが一致しないことで困っていた

# 困ってたこと

データ形式:
“`ruby
{
‘key’ => ‘value’,
‘created_at’ => ‘instance.created_at’,
‘updated_at’ => ‘instance.updated_at’,
}
“`

Timeオブジェクトはミリ秒の値まで含んでしまっているため、
データが一致せずにテストが落ちてしまう

“`plaintext
# 期待していたデータ
“created_at” => “2024-08-26T10:35:23+09:00”

# 実際に来たデータ
“created_at” => “2024-08-26T10:35:23.000+09:00”

“`

# as_jsonで試してみた

https://railsdoc.com/page/as_json

as_jsonではハッシュ形式に変換してくれるらしい

creat

元記事を表示

Rails7から追加されたレ楽にレコードを任意の順番に並び替えられる「in_order_of」

# はじめに

業務で「何かのレコードを特定のid順や数字で並べたい」みたいな要件に出会った経験ある人もいるのではないでしょうか?

当時エンジニア歴2年目の時に詰まった記憶があります笑

そのような時はどうやって実装しますか??

色々書き方はあると思いますが、***Rails7から追加***された“`in_order_of“`というメソッドが便利だったので紹介します。

https://railsdoc.com/page/in_order_of

# in_order_ofを使わない方法

まずは“`in_order_of“`を使用しない方法を考えようかと思います。

“`in_order_of“`の説明だけ見たい人はここは飛ばしてください。

*前提条件

モデル: User
並び替えカラム: id
並び順: [3,2,1]
PostgreSQL使用

“`ruby
ids = [3,2,1]
“`
*実際のクエリは変数を使っているので“`in ($1,・・・)“`みたいになってますが、本題とは関係ないので簡略化しています。

## 1.whereを使って実装

元記事を表示

dockerでrails new する one liner

# これはなに
`docker` で `rails new` するコマンドラインの備忘メモ
“`
docker run –rm -v $(pwd):/app ruby:3.3 bash -c “gem install rails; cd /app; rails new -B -d mysql
“`

# メモ
`-v $(pwd):/app`
コマンドを実行するカレントディレクトリを `/app` にマウントする
このディレクトリ直下に、 `` が作成される。

`ruby:3.3`
使用するdockerイメージ。
ruby 公式からバージョンを選択

`gem install rails;`
ここで、`rails` をインストールする。
必要に応じて、optionを指定

`rails new -B -d mysql;`
ここで、 `rails new` を実行。
`db` に `mysql` を指定

``
作成したい `project-name`

元記事を表示

RSpec の request spec で css_select を使って HTML の内容を確認する

# やりたいこと

RSpec の request spec であるエンドポイントが返す HTML の内容を確認したいです。

# 例

例えば、あるエンドポイントが

“`html

No 名前 絵文字 日時
3 さぶろう 🐈 2024/09/01 00:00:00
2 はなこ 🐕 2024/08/31 23:59:59
1 ジローラモ 🦘 2024/08/01 00:00:00

“`

IIS の CGI でバイナリデータを返すときにハマった

ウェブアプリケーションのサーバーサイドで Excel ブックを作成する必要があり、もともと IIS (Internet Information Services) と Ruby が動作する環境があったこともあり、rubyXL を試してみることにしました。

https://github.com/weshatheleopard/rubyXL

ひとまず、次のようなプログラムを作成してみました。

“`ruby
require “rubyXL”

workbook = RubyXL::Workbook.new

puts “Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”
puts “Content-Disposition: attachment; filename=\”filename.xlsx\””
puts

print workbook.stream.string
“`

しかし、ブラウザーで開くとファイルはダウンロードされるものの、そのファイルは Excel で開く

元記事を表示

古いバージョンのNodeやRubyで作ったアプリをherokuでデプロイする際の設定

## この記事の内容
### 起きたこと
herokuを使って講座で作成したWebアプリをデプロイしようしたところ、なにやらたくさんエラーが起こりました。
おきたエラーの詳細はエラー詳細に記載しています。

### 前提(バージョンなど)
– Ruby:2.7.7
– Rails:6.0.6.1
– Node.js:14.15.0
– Windows11でUbuntu(WSL2)を導入

### 原因
– Rubyのバージョンがherokuの最新バージョンに対応していなかった
– Nodeのバージョンがherokuが標準で使用するバージョンと異なっていた
– buildpackを導入していなかった

## エラー詳細1
### エラーメッセージ
“`
!
! The Ruby version you are trying to install does not exist on this stack.
!
! You are trying to install ruby-2.7.7 on heroku-22.
!
! Ruby ruby-

元記事を表示

【ABC369】D – Bonus EXP のイメージベース解説(動的計画法の基本が理解できる)

## 目的
[AtCoder公式解説](https://atcoder.jp/contests/abc369/editorial/10841)を見て動的計画法の基本が理解できたので、復習用にイメージベースで解説

## 問題
https://atcoder.jp/contests/abc369/tasks/abc369_d

## 解き方
1. モンスターを倒した回数が偶数回だった場合の経験値の合計の最大値(evenExp)と奇数回だった場合の経験値の合計の最大値(oddExp)を求める
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/94f8f92d-e0c4-69a4-49ad-0853523a116f.png)
※evenExpは`今回の経験値 * 2 + oddExp`と`計算前のevenExp`の最大値
※oddExpは`evenExp + 今回の経験値`と`計算前のoddExp

RSpecで快適にテストを書こう!初心者から上級者まで使える15のテクニック

## はじめに

RSpecは Ruby on Rails アプリケーションでよく使用されるテストフレームワークです。しかし、初めて触れる方にとっては少し難しく感じるかもしれません。この記事では、RSpecの基本から応用まで、15の章に分けてわかりやすく解説します。各章では、具体的なコード例と詳細な説明を提供し、RSpecの理解を深めていきましょう。

## 1. RSpecの基本構造

RSpecのテストは通常、`describe`ブロックで始まります。これはテスト対象を示すもので、クラスやメソッド名を記述します。その中に`context`ブロックを置き、特定の状況や条件を表現します。実際のテストは`it`ブロックの中に書きます。

“`ruby
describe User do
context ‘有効なユーザーの場合’ do
it ‘バリデーションが通る’ do
user = User.new(name: ‘山田太郎’, email: ‘yamada@example.com’)
expect(user).to be_valid
end

Ruby on Railsでコネクションプールを導入したredis-rbの導入方法

# 始めに

Ruby on Rails では、Redis を利用して一時的に値を保持するケースが多々あると思います。(たとえば、カート情報の管理やカウント処理など)
もし Redis の String 型のバリューのみで要件を満たせるのであれば、[Railsのキャッシュ機構(低レベルキャッシュ)](https://railsguides.jp/caching_with_rails.html#%E4%BD%8E%E3%83%AC%E3%83%99%E3%83%AB%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)を利用するだけで、Redis を簡単に扱うことができます。

Rails の `cache_store` に `:redis_cache_store` が設定されている前提で、以下のように Redis を利用できます。
“`ruby
# 取得
Rails.cache.read(key)

# 保存
Rails.cache.write(key, value)

# 削除
Rails.cache.delete(key)
“`
しかし、も

【Ruby on Rails】ルーティングで困ったroutes.rbについて振り返ってみる

こんにちは。あがさんです!!

見様見真似でRuby on Railsの学習をしています。
Railsガイドやチュートリアルが丁寧に教えてくれるので、分からない点があってもなんとなくアプリケーションが出来上がってしまいます。(凄い!けどなんとなくは良くない)

今回はRailsでアプリケーション開発をしていた際に、苦手意識を持っていたroutes.rbと
親の顔よりも見たlocalhost:3000/rails/info/routesのページについて触れていきます。

## ルーティング とは
Ruby on Railsにおいて、アプリケーション内のURLをコントローラのアクションに結びつける仕組みのことです。config/routes.rbファイルで定義します。
下記は簡単なroutes.rbのファイルです。

“`routes.rb
Rails.application.routes.draw do
# CRUD routes without using resources
get ‘users’, to: ‘users#index’
get

URL からクエリ文字列を取り除く

# やりたいこと

URL からクエリ文字列を取り除きたい。

# 方法

この記事では [URI](https://docs.ruby-lang.org/ja/latest/class/URI.html) オブジェクトを利用した方法を紹介する。もちろん正規表現などでも可能。

“`rb
require ‘uri’

url = ‘http://yoyonest.jp/view/item/000000047948?category_page_id=ct26’
URI(url).tap { _1.query = nil }.to_s
#=> “http://yoyonest.jp/view/item/000000047948”

# URI は
# [scheme, userinfo, host, port, registry, path, opaque, query, fragment]
# という構成要素からなる。
# 必要に応じて、あるいは必要はないが僕のように潔癖な人は fragment も取り除くとよい。
url = ‘http://yoyonest.jp/view/item

【個人開発】詐欺被害を減らしたい!詐欺を未然に防ぐためのアプリ「詐欺師の手帳」を開発しました📒

## はじめに
こんにちは! yukimuraと申します
未経験からのWebエンジニア転職を目指して、2023年11月からプログラミングスクール「RUNTEQ」に入学し、Ruby on Railsを中心にプログラミング学習を行っております。

今回「詐欺師の手帳」というアプリをリリースしました。
詐欺被害を未然に防ぐことを目的としております。

## アプリ紹介
[![Image from Gyazo](https://i.gyazo.com/7f2c2cfc4ad0b3f2699ed538ab8fc41a.png)](https://gyazo.com/7f2c2cfc4ad0b3f2699ed538ab8fc41a)

### サービスURL(レスポンシブ対応済)
https://scammers-notebook.com/
### GitHub URL
https://github.com/yuki51b/scammer-s-notebook

## 開発背景
 自分自身や家族、友人などが詐欺被害に遭った経緯から、詐欺は身近であると同時にYoutubeなどで多くの人が詐欺に引っ

【Rails】Minitestでのスタブとモックの使い方 入門

# はじめに
この記事は、RubyやRailsプロジェクトでMinitestを使ったことがあるけれど、スタブやモックについて理解がちょっと曖昧かも…という方のためにスタブやモックの基本的な考え方、使い方を解説するものです。

# スタブ、モックってそもそも何?

まずは、言葉の意味や基本的な使い方を見ていきます。

### スタブとその使い方
スタブというのは、「代用品」みたいな意味合いで使われます。Minitestでは主に、メソッドスタブというものを用意します。つまり、「代用メソッド」ですね。以下のように、自分の好きなようにメソッドの戻り値をセットできます。

“`ruby
require ‘test_helper’
require ‘minitest/autorun’

# 自己紹介ができる「パーソン」というクラスを例に取る
class Person
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end

def introduce_mysel

[Ruby][デザパタ]ObservableモジュールでObserverパターンを実現したい

# はじめに
ここ最近、「[Head Firstデザインパターン 第2版 ―頭とからだで覚えるデザインパターンの基本](https://www.amazon.co.jp/Head-First%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E2%80%95%E9%A0%AD%E3%81%A8%E3%81%8B%E3%82%89%E3%81%A0%E3%81%A7%E8%A6%9A%E3%81%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E5%9F%BA%E6%9C%AC-Eric-Freeman/dp/4873119766/ref=sr_1_4?dib=eyJ2IjoiMSJ9.I3V8tzJFQKj3ReUrnMzVQYuuDqtn5dFovGCunG2iSiww3K8Lw3d002R0yFNX0Ah0b0jfWG5Ks6kw_pj7exYx5ve

Mecabのインストール手順

## Mecabってなに?
– 形態素分析を行ってくるオープンソースのツールです
– 形態素分析は自然言語処理の手法の1つで、生成AIブームもあり注目されています
– 文章を解析して、名詞や動詞などの要素の単位に分解してくれる
– 京都大学情報学研究科と日本電信電話株式会社コミュニケーション科学基礎研究所が共同で開発した
– perl/ruby/python/java/C#に対応している
– ChaSenやKAKASIといった他ツールを比べて高速

## 環境
Ubuntu20.4

## Mecabのインストール手順
インデックスファイルを最新にします。

“`
$sudo apt-get update
“`

インストールするのに必要なライブラリは、ググるとサイトによって色々な情報が散見されます。

>mecab libmecab-dev mecab-ipadic-utf8

こちらの3つだけでOKにしているサイトもいくつかありますが、一番多くのライブラリ(6つ)をインストールしている手順を参考にしました。

“`
$sudo apt-get install libmecab

current_user関係のN+1を解決したい

# まえがき
先日からkindleチックなwebアプリを作っていたところcurrent_user関係のN+1問題にぶち当たったので解決方法等をまとめておく

# あらすじ
機能として「ログインなしでもセッションを使ってカートに商品は入れられるけど、ログインするときにセッションが残ってたらマージしてユーザーのカートと統合する」みたいなものです。

要するに、ログインなしの情報をユーザに引き継がせるみたいな。
(電子書籍を扱う想定なのでユーザーは同じ電子書籍を2つ以上変えません)

# コード
以下の想定。application_controller.rbでセッションの有り無しを判別して、
存在する場合はcartモデルの`combine_and_destroy_other_cart!`を呼ぶ。
内容としては
– 過去に注文していないもの
– カートに既に存在してもの

以上を満たすものをユーザーのカートに追加する。

その後セッションを破壊する。
以下詳細
### モデル
“`ruby
class User < ApplicationRecord # Include default

rbenvで指定したバージョンに切り替わらない時の対処法

毎回出会すたびに対処法を忘れるため、残したいと思った。

### 環境
機器:Apple M1 MacBook Pro
バージョン:macOS 14.0

## 本題

rubyを使った環境構築のためバージョンを確認すると、Macデフォルトのバージョンになっている
“` zsh
$ ruby -v
“`
> ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin23]

実際は3.3.0を選択している。
“` zsh
$ rbenv versions
system
3.2.2
* 3.3.0 (set by /Users/procrustes/.ruby-version)
“`

## 対処法
`rbenv init`コマンドで設定ファイルのパスを探す
“` zsh
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval “$(rbenv init – zsh)”

FizzBuzz問題で学ぶOCP(Open Closed Principle)

# 動画概要
以下の動画で、SOLID原則の一つであるOCP(Open Closed Principle・開放/閉鎖原則)について、FizzBuzz問題を通じて解説しました。
ソフトウェアの拡張に対して開かれている一方で、修正に対しては閉じているという原則です。

# 内容
## 元々のFizzBuzz