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

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

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
“`

#

元記事を表示

駅情報を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 は、その「土地を購入する」ことに相当します。これは、データベースを作成して、家を建てるための場所(データベース)が準備されるプロセスです。

元記事を表示

『メタプログラミングRuby』138ページのサンプルコードをIRBで実行するとエラーになる

## はじめに

『[メタプログラミングRuby 第2版](https://www.amazon.co.jp/dp/4873117437)』という書籍を読んでいて、混乱した箇所があったため、備忘録としてまとめます。

この記事におけるバージョンは **Ruby 3.3** です。

## 問題

p138では`Module#alias_method`の説明がされています。

`Module#alias_method`は既存のメソッドにエイリアス(別名)をつけるメソッドです。

次のサンプルコードで説明されています。

“`ruby:class_definitions/wrapper_around_alias.rb
class String
alias_method :real_length, :length

def length
real_length > 5 ? ‘long’ : ‘short’
end
end

“War and Peace”.length #=> “long”
“War and Peace”.real_length #=> 1

元記事を表示

Rails7後からimportmapでBootstrap5を導入するで大いに躓いた

公式や他の記事をみて、以下をおこなった。

“`bash
bin/importmap pin bootstrap
“`

まず、application.jsのimport”popper”でimportに関係するエラー
そうだよね、”@popperjs/core”という名前でpinしているんだもんな、で

“`
pin “@popperjs/core”, to: “popper.js”, preload: true
“`

“`
pin “popper”, to: “popper.js”, preload: true
“`
に変更

次はpopperがbootstrapで見つからないエラー
他のページをみてpin先をcdnに変えたりなど頑張った。
“`
pin “popper”, to: “popper.js”, preload: true
“`

結局application.jsのimportの順番を
“`
import “bootstrap”;
import “popper”;
“`

から

“`
import “popper”;
import “boo

元記事を表示

【gem:Refileの使い方】Railsでの画像投稿機能の実装方法

プログラミング初心者に向けて、Ruby on Railsで画像投稿機能を実装する方法についてご紹介します。今回は「Refile」というgemを使って、[以前解説したRuby on Railsを使って作成したシンプルなToDoアプリ](https://taishi-official.com/2020/04/25/433/)を例に実装していきます。

## 【gem】Refileとは
「Refile」はRuby on Railsのgemで、ファイルアップロードを簡単に実装するためのライブラリです。Refileを使うことで、画像のアップロードやリサイズ、クロップなどが簡単にできます。

またRefileでアップロードされた画像はRailsのActiveRecordを使用して、データベースに画像を保存することができます。GitHub上でオープンソースとして公開されています。

[>> 「Refile」のGitHub](https://github.com/refile/refile)

## 【gem】Refileを使って画像投稿機能の実装
### Gemfileに追記する
ge

元記事を表示

Rails 7.2 (Hotwire) でDeviseのログアウトリンクを作成

最近はRailsのアプリ開発から少し離れていましたが、Rails 7あたりからHotwireやYJITなどおもしろそうな動きもあり、またRailsに興味を持ちはじめています。

Rails 7.2のアプリでDeviseのログアウトリンクを作成したとき、Hotwireに対応する方法がわからなかったのですが、以下の情報を見つけました。

https://dev.to/spaquet/rails-7-devise-log-out-d1n

https://discuss.hotwired.dev/t/simple-method-delete-with-confirm/4834

開発中のアプリには以下のように記述して、以前と同様にログアウトができるようになりました。

“`erb
<%= link_to destroy_user_session_path, data: { turbo_method: :delete, turbo_confirm: t("views.confirm_sign_out") }, class: "dropdown-item" do %>

元記事を表示

ShoryukenをActiveJobのアダプターとして利用する際のリトライの挙動を調べた

# はじめに

Gakken LEAPで働いていますkoboriです。普段はRuby on Railsを使用したWeb APIの開発に携わっています。その中でShoryuken というgemに触れる機会があり、リトライ制御について調べた話について書いていきます。

# Shoryukenとは

ShoryukenはAmazon SQSに対応した、スレッドベースのメッセージプロセッサで、RubyGemとして提供されています。ShoryukenはプレーンなRubyプログラムに組み込むこともできますが、ActiveJobのアダプターとしても利用することもできます。
今回の記事では、ActiveJobのアダプターとして利用する場合のリトライの挙動について調べました。

# Shoryukenのリトライ制御について

ActiveJob経由でShoryukenを利用する場合、ActiveJobの`retry_on`メソッドを利用してリトライの設定を行うことができます。
しかし、単純に `retry_on` を定義すると、意図しない挙動になることが [wiki](https://github.co

元記事を表示

paiza×Qiitaキャンペーン Rubyでコードゴルフ【Dランク】

## はじめに
[paiza×Qiitaコラボキャンペーン](https://paiza.jp/pages/campaign/paiza-qiita) のDランク問題の[コードゴルフ](https://w.wiki/B2n2)にRubyで挑戦しました。
自分なりの解説も交えています。
恐らく最短ではないと思います。ですがせっかくの機会なので、自分の知見をまとめる目的で執筆しました。
さらに短くなるなどございましたら、コメントよろしくお願いいたします!

## N倍の文字列
https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square
#### 問題概要
標準入力で与えられた整数個`*`を繋げた文字列を出力してください。
#### Rubyコードゴルフ解答(16文字)
“`ruby
$><

元記事を表示

iOS で画像に設定したキャプションを Ruby で取得する

# やりたいこと

iOS で画像に設定したキャプション (任意の文字列) を Ruby で取得したいです。

iOS の画像

# 方法

キャプションは Exif 情報として画像ファイルに保存されています。Exif 情報を読み取るために [mini_exiftool](https://github.com/janfri/mini_exiftool) という Gem を使用します。まず [ExifTool](https://exiftool.org/install.html) というコマンドラインツールをインストールしておきます。そして mini_exiftool をインストールします。

“`shell-session
$ gem install mini_exiftool
“`

そして MiniExif

元記事を表示

【Rails】update_attributesが使用できない

## はじめに
Railsのアップデート中にupdate_attributesを使用している箇所でエラーが出たので、その対応をまとめます。

## 問題
以下のように、update_attributesを使用するとエラーが出ます。
“`ruby
@user.update_attributes(attributes)
“`

## 解決方法
Rails6.1からupdate_attributesは使用できなくなりました。
代わりにupdateを使います。
“`ruby
@user.update(attributes)
“`

## 参考

元記事を表示

備忘録: Nokogiri v1.16.1のXML::Readerへの変更を咀嚼してみる

>v1.16.1 / 2024-02-03
>Fixed
>
>- [CRuby] XML::Reader defaults the encoding to UTF-8 if it’s not specified in either the document or as a method parameter. Previously non-ASCII characters were serialized as NCRs in this case. [[#2891](https://github.com/sparklemotion/nokogiri/issues/2891)\] ([@flavorjones](https://github.com/flavorjones))

これが気になったので、まず既存のxmlパースの書き方と問題の`XML::Reader`の書き方を比べて、ライブラリのソースコードを見に行ってみる。

“`rb
# frozen_string_literal: true

require ‘nokogiri’
require “debug”

raw_xml =

元記事を表示

OTHERカテゴリの最新記事