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

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

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

元記事を表示

【Ruby入門】for文/while文 用途の違いによる構文理解

表題の件について技術記事を以下に記載します。

## 前提
私はプログラミング学習(主にはRuby)をはじめて1ヶ月弱の初心者ではじめて技術記事を投稿します。

まずは、初心者である私がつまづいた箇所について
理解の整理のために技術記事でアウトプットしていこうと思い立った次第です。
そのため、拙い箇所や認識齟齬がある箇所がある可能性がありますがその点についてはご容赦ください。
また記事に認識齟齬がありましたら訂正いたしますのでご指摘いただけますと幸いです。

## 何についての記事か
表題の通りとなりますが、
for文とwhile文について用途による使い分けによる構文理解というテーマで記載します。

## なぜ記事を書くのか
for文とwhile文の違いついて
コードを見て確かに違うことはわかるのですが、
なぜ違うのか、どう違うのか、今ひとつ理解できませんでした。

おそらく初学者においては一定数、
上記のような課題感を持っているのではないかと推察します。

そのため重複してしまい恐れ入りますが、以下の理由により記事を記載します。
・当該処理についてどう違うのか、なぜ違うのかを理解する

元記事を表示

ERB を使う場合は filename と lineno を指定するとデバッグで便利

ERB オブジェクトには `filename` と `lineno` という attribute がある。

https://gist.github.com/tomoasleep/068ad35e91567acdb5515ade870bca37

これに設定した値はエラー時の Stack Trace で表示される。

“`console
$ ruby run_erb_with_error.rb
run_erb_with_error.rb:6:in `

‘: undefined local variable or method `unknown_variable’ for main (NameError)
from ~/.anyenv/envs/rbenv/versions/3.3.1/lib/ruby/3.3.0/erb.rb:429:in `eval’
from ~/.anyenv/envs/rbenv/versions/3.3.1/lib/ruby/3.3.0/erb.rb:429:in `result’
from ~/.

元記事を表示

カラムの追加、削除

## 1. カラムの追加
`$ rails g migration`でmigrationファイルを作成する。
例えば、`users`テーブルに`age`カラムを追加する場合、以下のようにコマンドを実行する。

“`
$ rails g migration AddAgeToUsers age:integer
“`

生成されたmigrationファイルは以下のようになる。

“`ruby
class AddAgeToUsers < ActiveRecord::Migration def change add_column :users, :age, :integer end end ``` データベースに反映。 ```bash $ rails db:migrate ``` ## 2. カラムの削除 不要になったカラムを削除する場合も、同様にmigrationファイルを作成する。 例えば、`users`テーブルから`age`カラムを削除するには、以下のコマンドを実行する。 ```bash rails g migration RemoveAgeFromUsers

元記事を表示

【Rails】scopeの注意点

# scopeのメリット
:::note
– 繰り返し利用するクエリの再利用性が上がる
– クエリに名前を付けることで、可読性が向上する
:::

# scopeの注意点
:::note warn
scopeの結果が`nil`となった場合は、`nil`を返す該当scopeの検索条件を除外したクエリを発行し、必ず***ActiveRecord::Relation***を返すという動作が行われる
:::

本記事は、こちらの注意点にフォーカスします。

# (先に)結論

:::note
`nil`を返す可能性がある場合にはscopeで定義せず、クラスメソッドで定義する
:::

# 動作確認のための準備

## 環境
– Rubyバージョン:`2.6.6`
– Railsバージョン:`6.0.3`

## モデルの作成
“`
rails g model Book book_title:string publication_date:date price:integer
“`

## マイグレーション
“`
rails db:migrate
“`

## s

元記事を表示

駅情報をcsvでシードデータに登録する

# 初めに
以前とあるアプリを開発時に駅情報や路線情報が必要になり、色々と調べましたが情報を集めるのに苦戦したため記事を書こうと思い至りました。
間違っている等あればコメントよろしくお願いいたします。
また、本記事に関しては駅情報のみについて記載しますが、路線情報についても手順は一緒のため割愛致します。

# 手順
## 1,モデル作成
まずは対象のモデルを作成致します。
“`
rails g model Station
“`
## 2,マイグレーションファイルに記述
①先ほどのコードでマイグレーションファイルが作成されるので中身を記述して行きます。
“`
def change
create_table :stations do |t|
t.integer :station_cd
t.integer :station_g_cd
t.string :station_name
t.string :station_name_k
t.string :station_name_r

元記事を表示

Ubuntu 24.04に上げたら Rails で libMagickCore-6.Q16.so.6 が見つからなくなった話

## 状況の説明

私のRailsプロジェクトでは、画像処理に`ImageMagick`を利用しており、特に`rmagick`というGemを使っています。Ubuntuを`22.04`から`24.04`にアップグレードした後、アプリケーションをデプロイしようとしたところ、次のようなエラーが発生しました。

“`zsh
LoadError: libMagickCore-6.Q16.so.6: cannot open shared object file: No such file or directory – /deploy/apps/langfix/shared/bundle/ruby/3.3.0/gems/rmagick-6.0.1/lib/RMagick2.so (LoadError)
“`

このエラーは、`libMagickCore-6.Q16.so.6`という`ImageMagick`のライブラリが見つからないことを示しています。

## 原因

Ubuntuのバージョンアップによって、多くのライブラリも更新されます。その結果、依存関係にあるライブラリのバージョンが変更され

元記事を表示

文字列中に同じ文字が並んでいたら1文字にまとめたい

文字列中に同じ文字が並んでいたら1文字にまとめたい場合、Rubyでは`String#squeeze`を利用します。

“`ruby
p “112233445566778899”.squeeze
#=> “123456789”
“`

Python3で、同じことを実現するにはどうすればよいでしょうか?

まず`itertools.groupby`を利用する方法があります。

“`python
import itertools
s = “112233445566778899”
t = ”.join(c for c, _ in itertools.groupby(s))
print(t)
#=> ‘123456789’
“`

内包表記の代わりに`operator.itemgetter`を利用することもできます。

“`python
import itertools, operator
s = “112233445566778899”
t = ”.join(map(operator.itemgetter(0), itertools.groupby(s)))
print(t)

元記事を表示

【Ruby on Rails】学習メモ:配列と繰り返しで金額を集計したい!①

今回はRuby on Railsの学習メモです。
学習の記録および備忘録として記します。

* 前回のRuby on Rails学習メモ
[【Ruby on Rails】学習メモ:配列のエラーにはまった話](https://qiita.com/nat_s/items/0ff31807461d9fe4ab9c)

# 筆者のステータス
引き続き、Ruby on Railsを学習中。
改修を担当している機能にて、配列やループ処理(繰り返し)を用いる場面が増えてきている。

# 実現したいこと
ある事柄に関する、項目別合計金額の集計、表示。
集計対象は次のような要素で成り立っている。

* 大項目
* 中項目
* 金額

本稿では、大項目=品名、中項目=手数料 として記述。
同じ品名でも異なる手数料が設定されている場合があり、金額と手数料(%)をもとに、手数料の具体的な金額を計算する必要がある。

* 集計対象のイメージ
“`
| 品名 | 手数料 | 金額 |
————————
| 野菜 | 5% | 300 |
| 野菜 | 10% |

元記事を表示

例え話で学ぶ rake dbの覚書 w/chatGPT

# rakeとは
rakeとはRubyにおいて色々やってくれるツールのことです。その中でもsinatraやRails上でデータベースに対して何か操作を行いたいときに行うコマンドが`rake db: hogehoge`です。

本記事ではわかるようでわからないrake dbコマンドをみんな大好きchatGPTくんが家の建築に例えてくれたのでわかりやすい(?)例え話を聞きながら理解していきます。

完全に蛇足ですが例え話をchatGPTにイラストまで生成させたので楽しんでいってください。

# rake db:create

プロジェクトフォルダ内のdatabase.ymlファイルに基づいてデータベースを作成します。

開発の途中で作っていくテーブルを保存する場所です。新しくプロジェクトを作成したらまずこのコマンドを実行してデータベースを作ります。

身近なものに例えると、、、

まず、家を建てるためには土地が必要です。rake db:create は、その「土地を購入する」ことに相当します。これは、データベースを作成して、家を建てるための場所(データベース)が準備されるプロセスです。

元記事を表示

OTHERカテゴリの最新記事