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

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

rails パンくずリストの作り方(gem ‘gretel’)

今回は業務の中で初めてパンくずリスト機能に触れたので、こちらについて勉強したことをまとめます。

## パンくずリストとは?
パンくずリスト(Breadcrumbs)は、Webサイトのナビゲーション要素の一つで、ユーザーが現在のページに至るまでの階層構造やパスを表示するためのものです。パンくずリストは、ユーザーが現在どの位置にいるのかを視覚的に示し、上位のページや関連するカテゴリーに簡単に戻れるようにするために利用されます。

## 実装方法
では実際にはどのように実装をするのか?

まず、下記のgemを使用します。
“`
gem ‘gretel’
“`
このgemの名前の由来は、グリム童話の「ヘンゼルとグレーテル(Hansel and Gretel)」に登場するキャラクター、グレーテル(Gretel)から来ています。

「ヘンゼルとグレーテル」は、グリム兄弟によって記録された有名なドイツの民話です。物語の中で、ヘンゼルとグレーテルは森の中に置き去りにされますが、パンくずを道しるべとして使って家に戻ろうとします。このパンくずが、「パンくずリスト」(Breadcrumbs)というナビ

元記事を表示

rails 簡易的な閲覧数カウント機能

今回は業務の中で簡易的なページ閲覧数をカウントする機能を作る必要があり、その時に実装した内容を記録として残します。

## 実装例
今回は簡易的なcolumnテーブルがあると仮定して実装を進めていきます。
“`
| id | title | content | created_at | updated_at |
|—–:|:———-|:———-|:——————–|:——————–|
| 1 | Article 1 | Content 1 | 2024-01-01 00:00:00 | 2024-01-10 00:00:00 |
| 2 | Article 2 | Content 2 | 2024-02-15 00:00:00 | 2024-02-20 00:00:00 |
| 3 | Article 3 | Content 3 | 2024-03-10 00:00:00 | 2024-03-15 00:00:00 |
| 4 |

元記事を表示

RailsのTimeクラスを覚えたい

# 概要
– 何度書いても忘れるのでメモ的な記事
– RailsはRubyのTimeクラスを拡張しているとのこと

# ドキュメント

ここみればいいと思います。

https://api.rubyonrails.org/classes/Time.html

# 今を取る

“`ruby
Time.current
=> Sat, 01 Jun 2024 10:24:15 JST +09:00
“`

`Time.now` でも取れるが、`Time.current`の場合、`Time.zone`または`config.time_zone`が設定されていれば、`Time.zone.now`を返してくれるのでお得(?)

# 今より前の時間を取りたい

色々ある

“`ruby
Time.current.ago(1.day)
=> Fri, 31 May 2024 10:25:03 JST +09:00
“`

intから`day`や`hour`を生やすことができる。複数形でも良い

“`ruby
[23] pry(main)> 3.day
=> 3 days
[24] pry(m

元記事を表示

RailsとReactのDocker環境を作ってみる

## Rails環境を作る

### Dockerfile
リポジトリのトップにbackendディレクトリを作成。
backendディレクトリにDockerfileを作成。
“`Dockerfile:Dockerfile
FROM ruby:3.1

WORKDIR /app
“`
dockerをビルド。
“`shell:
docker build .
“`
docker経由でrailsアプリケーションを作成。
Dockerfileがコンフリクト起こすけど、上書きはしない。
“`shell
docker run -it -v $(pwd):/app imageId bash -c “cd .. && gem install rails && rails new app -d postgresql –api”
“`
Dockerfileを書き換える。
“`Dockerfile:Dockerfile
FROM ruby:3.1

WORKDIR /app

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfil

元記事を表示

【RSpec】Shoulda Matchersの書き方について

## はじめに
### [shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers)とは
Railsのテストコードをより簡潔かつ読みやすくするためのRSpec用の拡張ライブラリです。

#### Q. 何が良いのか?
A. [特に複雑なテストケースを1行で記述できることが多く、テストコードの行数の大幅な削減が期待できます!](https://matchers.shoulda.io/docs/v6.3.0/)

#### 設定方法
以下のようにGemfileのテスト環境に“`shoulda-matchers“`を追加します。
(詳しくは[公式ドキュメント](https://github.com/thoughtbot/shoulda-matchers?tab=readme-ov-file#rspec)にてご確認ください🙇‍♂️)
“`.Gemfile
group :test do
gem ‘shoulda-matchers’, ‘~> 6.0’
end

元記事を表示

WSL 2とDockerを活用したRuby開発環境の構築

# はじめに
Windows上でネイティブのLinux環境を提供するWSL 2と、コンテナ技術であるDockerを組み合わせることで、軽量かつ効率的なRuby開発環境を構築できることを説明します。

Windows Subsystem for Linux (WSL) のセットアップはこちら

https://qiita.com/oharu121/items/9acaf1e700aea80323c1
# Ubuntuを起動する
Ubuntuを起動して、WSL環境が正しく動作していることを確認します。

1.Windowsの検索バーから「ターミナル」と入力して、ターミナルを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/4a6d5787-d1c9-4e57-b370-b5a3aa1856aa.png)

2.ドロップダウンメニューから「Ubuntu」を選択します。
![image.png](https://qiita-image-store.s3.ap-north

元記事を表示

MVCをレストランに例えてみた

# はじめに
今回はRubyonRailsなどで用いられているMVCというものについて解説していきたいと思います。Railsをはじめ、MVCを採用しているフレームワークは多くあると思います。RailsにおいてはRailsチュートリアルやProgateでも初めの方で解説していることからこの構造を理解しておくことは非常に重要です。今まであまり考えずに使用してきたのであれば、この際詳しく知っておくと良いでしょう。

## MVCとは
ソースコードをそれぞれ
**・モデル(Model)**
**・コントローラー(Controller)**
**・ビュー(View)**

の3つに分割して管理しようという考え方の1つです。それぞれの頭文字を取ってMVCとなっています。

*****
**モデル(Model)**
例えば投稿した人の名前や投稿したテキストなどを保存する際などにデータベースとのやりとりをします。データの登録・更新・削除などの処理を行います。

**コントローラー(Controller)**
モデルにデータ処理の指示を出したり、ビューに画面表示の指示を出したりする指示役です。

**

元記事を表示

ログアウトでルーティングエラー

# Routing Errorが起きた

deviseを導入して、ログアウトしようとしたところ、下記のエラーが発生しました

“`
ActionController::RoutingError (No route matches [GET] “/users/sign_out”):
“`

このエラーの原因はアプリを作成したばかりで、javascriptが正常に動作していないことが原因でした

# 原因の確認
ルーティングがあっているか確認
“`
destroy_user_session DELETE /users/sign_out(.:format)    public/sessions#destroy
“`

“`_header.html.erb
<%= link_to destroy_user_session_path, method: :delete, style: "display:flex; align-items: center; flex-direction: column;" %>
“`

path名も正しい、`method: :delete`と記述している

元記事を表示

【Rails6】[ActionDispatch::HostAuthorization::DefaultResponseApp] Blocked hosts:の対処法

## 問題
Rails6で任意のhost名でアクセスしようとした時に、以下のエラーがでます。
“`ruby
[ActionDispatch::HostAuthorization::DefaultResponseApp] Blocked hosts: example.com
“`

## 解決方法
Rails6で追加された、ActionDispatch::HostAuthorizationによるものです。
https://github.com/rails/rails/pull/33145

対応方法は以下の3つがあります。
### 1. Rails.application.config.hostsにhostを追加する
development環境では、デフォルトで以下のhostが登録されています。
これ以外で接続しようとするとブロックされるため、必要なhost名を追加します。
“`ruby
Rails.application.config.hosts = [
IPAddr.new(“0.0.0.0/0”), # All IPv4 addresses.
IPAddr.new(“

元記事を表示

[実装のヒント] true / false を返すメソッドをシンプルに実装する

最近自分が実装しているのを見せながらペアプロしたりする時に『こういう実装はダメなんですか?』って質問を受けることがある。

そんな中からとして **『こうあるべき実装』** と、 **『動くかもしれないけど望ましくない実装』** とかをサンプルや実装していく順序なども交えながら記事にして残しておこうかなと思う。

## true / false を返すメソッドを実装する

まずは実装の前提となるクラスの初期化用のコードを貼っておく。

“`ruby
class SomethingOutputService
include ActiveModel::Model
attr_accessor :date_from
attr_accessor :date_to

def initialize( date_from, date_to )
begin
self.date_from = Time.parse( date_from )
self.date_to = Time.parse( date_to )
rescue ArgumentErr

元記事を表示

[実装のヒント] Rails での開発の時は blank? と present? を使いこなす

Rails用に条件分岐のコードを書く時、`blank?`メソッドと`present?`メソッドを効率的に組み合わせるだけですごく可読性のいい式が書ける。特に最近、緩やかなコード規約というものを開発チームと共有していて、その中で`unless`文の使用はよっぽどのことがない限り避けるように記載していたりする。で、実例だ。今回は haml で書かれたファイルの中に条件分岐のコードがあるってサンプルでサクッと解説する。

“`haml
– unless name.blank?
= name
“`

**『name が空じゃなかったら表示する』** ってだけのすごいシンプルなコード。ただこのコードは`unless`文を使う必然性がない典型的な例だ。`if`文に置き換えても否定式にすることもなく、以下のように書くことがでける。

“`haml
– if name.present?
= name
“`

**『name が空じゃなかったら表示する』** は __『name が存在したら表示する』__ と読み替えることができる。それをそのままコードにしただけ。他の言語だとあまり見かけ

元記事を表示

【paiza】ハンドルネームの生成問題を解いてみた

## 初めに 
paizaでハンドルネームの生成問題を解いてみました。

## 問題

https://paiza.jp/works/challenges/416/retry

## 解答
“`Ruby
def hundleName(name)
name.gsub(/[aeiouAEIOU]/, ”)
end

name = gets.chomp
puts hundleName(name)
“`
– `gsub`メソッドを使用して母音(大文字と小文字の両方)を正規表現でマッチさせ、それらを空文字 ” に置き換えています。

### `gsub`メソッドについて
gsub メソッドは、Rubyの文字列操作において非常に便利なメソッドで、文字列の一部を置換するために使用されます。gsub は「global substitution(全体置換)」の略です。gsub メソッドは、元の文字列のすべての一致部分を新しい文字列に置き換えた結果を返します。
### 基本的な使い方
“`ruby
str = “hello world”
new_str = str.gsub(‘l’, ‘

元記事を表示

エンジニア初心者が感動したCursor vs. VS Code: AIで簡単にコードを書く方法

## はじめに
エンジニアとして効率的にコードを書くことは、開発スピードや品質を向上させるために非常に重要だと思っています。私はエンジニア初心者のため、コードエディタは初めて触りますが、CursorのAI機能はまさに初心者のためにあるようなもので。とても感動しました!
 この記事では、人気のあるコードエディタであるVS Codeと、AIを用いて簡単にコードを書くことができるCursorを比較し、特にAIによる質問機能について詳しく説明します。

## VS Codeとは
Visual Studio Code(VS Code)は、Microsoftが開発した無料のソースコードエディタです。以下の特徴があります:

– **拡張機能**:膨大な数の拡張機能が提供されており、言語サポートやデバッグツールを簡単に追加できます。
– **統合ターミナル**:エディタ内でターミナルを開くことができ、コマンドライン作業を効率化します。
– **Git統合**:Gitリポジトリとの統合が強力で、バージョン管理が容易に行えます。
https://www.cursor.com/

## Cursorとは

元記事を表示

gzipファイルがダウンロード時に勝手に展開されてしまう怪奇現象(しかも、拡張子が.gzのまま……)

# ことの発端

とあるテスト中の顧客から、「ファイルのインポートができない」と問い合わせがありました。
インポート処理は顧客のサーバに配置されたgzipファイルをダウンロードしてからインポートするというもの。

エラーメッセージを見ると、`gzip以外の形式で圧縮されているファイル`とのことで、
これは、内部でgzipファイルを展開する際に`Zlib::GzipFile::Error`が出た場合に出るメッセージです。

しかし、実際に配置されているファイルをcurlでダウンロードすると普通にgzipファイルでした。fileコマンドの結果もちゃんとgzipです。
gzip展開するコードにも特に変な箇所は見当たりません。ただ単にextractを実行しているだけのコードです。
“`ruby
def extract(content)
FileIo::Archive::Gzip.extract(str: content)
“`

なんでgzip展開でエラーが出ているのかわからない……

## おかしな点に気づく

顧客ファイルをブラウザ上で閲覧すると(テスト時だったので、公開し

元記事を表示

誰も使わなかった奇妙な設定

> こちらは「Ruby on Rails パフォーマンスアポクリファ」のサンプル章です。[日本語での完全版が現在Gumroadで入手可能です](https://nateberk.gumroad.com/l/apocrypha_ja)。

Rails のバックグラウンドジョブの多くには、一般にパフォーマンスの問 題があります。
バックグラウンドジョブでは、しばしば大きなデータセットを処理しま す。そして、その際に User.all.each(&:send_daily_newsletter) のよ うな愚かなことをしてしまいます。

開発環境やテスト環境では、User.all が返すのは、おそらく数行、多くて も十数行でしょう。開発者の多くは、自分のローカルマシン上の seed デー タを極端に限定しています。

しかし、プロダクション環境では、User.all はおそらくかなりの数の行 を返します。開発するアプリケーションによっては、数十万行になるかもし れません。

10 万行を返す結果セットには、ほんのわずかばかり問題があります。それ は SQL クエリーが返すのに時間がかかると

元記事を表示

【Ruby】通常のクラス定義とClass.newによるクラス定義の違い

## はじめに

通常のクラス定義とは別に`Class.new`という書き方でもクラスを定義できることを知りました。

この記事では通常のクラス定義と`Class.new`でクラス定義した場合の挙動の違いについてまとめます。

バージョンは**Ruby 3.3**です。

## `Class.new`を用いたクラス定義のやり方

`Class.new`を使用してクラスを定義する方法は、通常のクラス定義とは少し異なります。

以下に、両方のやり方を比較しながら説明します。

なおこの記事では通常の方法で定義されるクラスを`NormalClass`、`Class.new`を用いた方法で定義されるクラスを`DynamicClass`と命名していきます。

### 基本的なクラス定義

`Class.new`でクラス定義する場合、`do … end`のブロックを渡してその中でクラスの中身を記述します。

クラスの使い方はどちらも同じです。

通常のクラス定義:

“`ruby
class NormalClass
attr_accessor :name

def initializ

元記事を表示

Basic認証の導入ガイド

### 概要
Basic認証とは、HTTP通信の規格に備え付けられているユーザー認証の仕組みです。サーバーと通信できるユーザー名とパスワードをあらかじめ設定し、それに一致するユーザーのみがWebアプリケーションを利用できるようにします。この記事では、RailsアプリケーションにBasic認証を導入する方法を簡単に説明します。

### 1. Basic認証の設定方法

#### 1.1 コントローラーでの設定
`authenticate_or_request_with_http_basic`メソッドを使用して、開発中のRailsアプリケーションにBasic認証を導入します。以下の例では、ユーザー名`admin`とパスワード`password`で認証を行います。

“`ruby
class ApplicationController < ActionController::Base before_action :basic_auth private def basic_auth authenticate_or_request_with_http_basic do

元記事を表示

【Ruby】whileの戻り値を正しく把握していなかった

素のRubyを用いてちょっとした業務カイゼンアプリを作ってたのだが、そのときにほんの少しだけ当たった問題

※ 鬼基本的な内容です

# `while`は`nil`を返します

※単一ファイルで書かれたスクリプトを想定しています

「渡ってきた日付(`date`オブジェクト)が土日祝のいずれかに当てはまるかを判定し、当てはまる場合は平日になるまで1日ずつ日付を加算する」という処理を作っていた

– 日付を加算するには`date`オブジェクトに`+ 1`をしていけばよい
– 土日の判定はDateクラスにある`saturday?`や`sunday?`が、日付が土日の場合に`true`を返す
– 日本の祝日判定は`HolidayJp`というGemのメソッドを使えば同じように祝日に当てはまるとき`true`を返す
– [holiday-jp/holiday_jp-ruby: Japanese holiday.](https://github.com/holiday-jp/holiday_jp-ruby)
– 上記が`true`のときに日付を1日加算したい

→ **条件が`true`

元記事を表示

素朴な疑問 ~ シリアライザーって何? ~

# 素朴な疑問
筆者が新人教育する中で、プログラミング実務未経験者がよくされる質問を紹介します。
未経験者に限らず、「そういえば何のために使っている技術(ツール)なんだっけ?」とよく理解していないまま利用しているケースも少なくありません。
この記事で、その純粋で素朴な疑問を改めて明確にして理解を深めていきましょう!

# 今回の疑問
今回の疑問は表題通り、

**シリアライザー** って何?」 です!

実務未経験者のポートフォリオレベルでは、シリアライザーを [ActiveModelSerializers](https://github.com/rails-api/active_model_serializers) などのライブラリを使って導入されておらず、実務で初めてシリアライザーの存在を認識するケースが多いようです。
そこで、本記事で取り上げたいと思います!

# シリアライザーって何?
Railsのシリアライザーは、データをJSON形式に変換するためのツールです。
簡単に言うと、**データベースから取り出した情報

元記事を表示

Devise のモジュール(confirmable, lockable, omniauthable 等の機能)を後から有効化する

成り行き任せで作っていない限りそんなことはあまり起こらないかとは思うのですが、
成り行き任せで作っていてデフォルト(`rails g devise:install` しただけ)では有効化されていない Devise の下記モジュールを後から有効化することになったのでその顛末を記しておきます。

“`
:confirmable, :lockable, :timeoutable, :trackable, :omniauthable
“`

環境は Windows 10 Pro、Ruby3.2.2、Rails7.1.2、devise4.9.3。
認証機能を入れる(`rails g devise` する)モデルは本稿では `User` としていますので異なる場合は適宜読み替えてください。

## 通常(Devise導入時に同時に有効化)との比較

Devise を導入する際の手順は大雑把に以下のような感じですが(Devise導入手順を仔細に解説した記事はごまんとありますので詳細はそれらをご覧ください)、

> 1. gem を `bundle install`
> 2. インストール(`$

元記事を表示

OTHERカテゴリの最新記事