Ruby関連のことを調べてみた2023年07月15日

Ruby関連のことを調べてみた2023年07月15日

Ubuntuで「Ruby on Railsチュートリアル」の実行環境を作る

# はじめに
Ubuntuに「[Ruby on Railsチュートリアル](https://railstutorial.jp/ “Ruby on Railsチュートリアル”)」の実行環境を整えます

# 実行環境
OS:Ubuntu22.04.2 LTS
Ruby on Railsチュートリアル:第7版
Ruby:3.1.2(Ruby on Railsチュートリアルに合わせてます)
Rails:7.0.4(Ruby on Railsチュートリアルに合わせてます)
Bundler:2.3.14(Ruby on Railsチュートリアルに合わせてます)

# インストール
## 必要なツールをダウンロード
参考:[(Ubuntu)Ruby on rails 6.0 環境構築](https://qiita.com/Gushi_maru/items/f3b5cc43e135e678085f)
ほぼ上の記事通りです。
バージョンとインストールするものが若干異なるだけです。

“`
sudo apt update -y
sudo apt upgrade -y
sudo apt install b

元記事を表示

Sorbetを使ってRubyでAbstract Classを使う

RubyKaigiで以下のセッションでRBIとRBSの比較がいろいろ紹介されていました。
その中で、RBIの機能としてAbstract classの説明があり、面白そうだったので使ってみました。

https://rubykaigi.org/2023/presentations/Morriar.html#day3

## Abstract Classについて

Abstract Class, Abstract Moduleは1つ以上のAbstract Methodを持つクラス、モジュールです。

以下のように定義します。

“`diff_ruby:base_engineer.rb
# typed: true

class BaseEngineer
extend T::Helpers
extend T::Sig

+ abstract!

def initialize(name:)
@name = name
end
end
“`

すると、このAbstract Classのインスタンスを作成しようとすると、型エラーを発生させます。

“`rb
# type

元記事を表示

Ruby 配列 ブロックについて 2

# はじめに
– Rubyの配列やブロックの復習用(2日目)
– 学習したことの備忘録
– 「[Ruby 配列 ブロックについて](https://qiita.com/takayuki91/items/8842c3ac481528097251)」の続き

# 学習内容
##### 配列(Arrayクラス)
– 要素の選択や追加
– 集合

# 参考にした教材
– [プロを目指す人のためのRuby入門]( https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%8

元記事を表示

開発ツールに頼らず 様々な言語から WebAssembly(第6回)

WebAssembly は多くのプログラム言語からライブラリの様に呼び出す事が出来る。
WebAssembly のコードを書く方法は多くの記事で書かれているが、その使い方はフレームワーク等のツールに頼っている事が多い様だ。
本記事では、そのような便利ツールに出来るだけ頼らず JavaScript, Rust, Python, Ruby から WebAssembly を実行する方法を記載する。

WebAssembly は新しい技術である。
目先の最先端ツールに飛びつくのもよいが、その基礎を学んで長く使える知識を身に着けないか?

本記事はシリーズの第6回である。シリーズ記事の一覧は [第1回] の **#シリーズ記事一覧** に載せている。シリーズの記事を追加する時は [第1回] の一覧を更新して通知を行うので興味の有る人は [第1回] をストックして欲しい。

# 本記事の概要と過去記事の復習

[第5回] では 1 個のグローバル変数を複数のインスタンス間で共有する方法について紹介した。
今回は、外部プログラムから共有する関数を切り替える事で WebAssembly の挙動を変更

元記事を表示

フリーランス歴20年の強強エンジニアからのガチコードレビュー集

# はじめに
こんにちは、[まつけん](https://twitter.com/matsuken_web314)です。
早いもので、Webエンジニアになって、**10ヶ月**経とうとしています。
先月末、僕の職場に参画していたフリーランス歴20年の強強エンジニアCさんが卒業されました。(以降**Cさん**と称します)

Cさんには、いつも迅速かつ丁寧なレビューをしていただいてました。
たまに補助で僕のプルリクにコミットを積んでもらうことなどもあり、お世話になった記憶が大半です。

今回はそんなCさんから受けたコードレビューから、今後どう改善していくのかアウトプットして学びを深めたいため、こちらの記事を書きました。

ペアプロしている時の参考になったこともおまけで書いてます。

:::note info
**この記事が参考になりそうな読者**
– Rubyの「アンチパターン」から良いコードを学びたい人
– エンジニア1年目がどんなコードレビューを受けているのか知りたい人
:::

※こちらの記事に出てくるコードに関しては全て`Ruby`です。実務で学んだことなので、出てくるコードは

元記事を表示

RubyでAtCoder ABC233(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC233のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A – 10yen Stamp
https://atcoder.jp/contests/abc233/tasks/abc233_a
“`ruby:a-233.rb
x, y = gets.split.map(&:to_i)
y -= x
if y < 0 puts 0 exit end ans = y / 10 puts y % 10 == 0 ? ans : ans + 1 ``` # B - A Reverse https://atcoder.jp/contests/abc233/tasks/abc233_b ```ruby:b-233.rb l, r = gets.split.map(&:to_i) l -= 1 r -= 1 s = gets.chomp s[l..r] = s[l..r].chars.reverse.join puts s ``` #

元記事を表示

Ruby 配列 ブロックについて

# はじめに
– Rubyの配列やブロックの復習用
– 学習したことの備忘録
– 今回は1問1問式

# 学習した内容
– 配列(Arrayクラス)
– ブロック

# 参考にした教材
– [プロを目指す人のためのRuby入門]( https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA

元記事を表示

【Rails7】rails/request.jsでAjax制御する

表題通りです。RailsでAjax制御するには今まではjqueryを使ったりしてきました。Rails6になってからrails-ujsというライブラリが推奨され、それによってイベント発火して対応したのですが、このrails-ujsはRails7で非推奨となってしまいました。

代わりに実装された同期制御用のスクリプトturboですが、これはどうも不具合が多く、評判が今ひとつ芳しくない上にRansackとの相性もあまり良くありません。何よりテンプレートやコントローラーで色々書き換えが必要になるのが面倒です。そこで代わりの非同期通信手段を調べていたところ、**rails/request.js**というものも提供されたみたいで、これを使ってAjax制御できるみたいです。

Githubの公式マニュアル
– [rails/request.js](https://github.com/rails/request.js)
Qiita内に触れている記事
– [【Rails7】Ajaxリクエスト時にCSRF tokenを含める(おそらく)公式のやり方](https://qiita.com/gnattal

元記事を表示

開発ツールに頼らず 様々な言語から WebAssembly(第5回)

WebAssembly は多くのプログラム言語からライブラリの様に呼び出す事が出来る。
WebAssembly のコードを書く方法は多くの記事で書かれているが、その使い方はフレームワーク等のツールに頼っている事が多い様だ。
本記事では、そのような便利ツールに出来るだけ頼らず JavaScript, Rust, Python, Ruby から WebAssembly を実行する方法を記載する。

WebAssembly は新しい技術である。
目先の最先端ツールに飛びつくのもよいが、その基礎を学んで長く使える知識を身に着けないか?

本記事はシリーズの第3回である。シリーズ記事の一覧は [第1回] の **#シリーズ記事一覧** に載せている。シリーズの記事を追加する時は [第1回] の一覧を更新して通知を行うので興味の有る人は [第1回] をストックして欲しい。

# 本記事の概要と過去記事の復習

[第3回] と [第4回] は WebAssembly のコードに状態を持たせる方法について記載した。
今回は WebAssembly に「クラス変数」の様な物を追加するコードを紹介する。

元記事を表示

Railsで入力フォーム等にバリデーションを設定する

# そもそもバリデーションとは
入力フォームなどでユーザーが故意または過失のもと誤った情報を入力した際に、入力内容をそのまま登録するのではなく、エラーをかえすこと。
これにより、誤情報を未然に防ぐほか、攻撃者からのXSSなども防ぐことが可能になる。

# 実装例
RailsのModelに記述します。

– 空データを登録できないようにする
“`ruby:member.rb
class Member < ApplicationRecord validates :name, presence: true end ``` - 文字数を制限する。 ```ruby:member.rb class Member < ApplicationRecord #長さの上限を50文字に設定 validates :name, length: { maximum: 50 } #長さの下限を2文字に設定 validates :name, length: { minimum: 2 } #長さの範囲を2-50文字 validates :name, lengt

元記事を表示

rails7.2から`TestFixtures#fixture_path`が廃止されるためrails 7.1では`DEPRECATION WARNING: TestFixtures#fixture_path is deprecated`が発生する

# 発生する理由

`rspec_helper.rb`の中で以下のように`fixture_path`を指定してテストケースで参照している場合に`DEPRECATION WARNING`が発生します。

“`ruby:rspec_helper.rb
config.fixture_path = Rails.root.join(‘spec/fixtures’)
“`

“`ruby:spec/sample_spec.rb
Rack::Test::UploadedFile.new(“#{fixture_path}/test.txt”)
“`

### DEPRECATION WARNING

“`
DEPRECATION WARNING: TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2. Use #fixture_paths instead. If multiple fixture paths have been configured with #fixture_paths, then

元記事を表示

[Rails] MySQL関数 TIMESTAMPADD で動的に日付計算して絞り込む

# 背景

– 複数の「住宅/Article」がある
– 住宅にはそれぞれその建物が「完成した日/completion_date」が登録されている
– 住宅には加入している定期点検のサービスがそれぞれあり、
– 加入しているサービスごとに点検時期(InspectionMonth.month)が複数設定されている
– 例えば、
– 住宅Aでは「1カ月点検」「3カ月点検」「1年点検」
– 住宅Bでは「5年点検」「10年点検」「50年点検」
– などなど

## 目的

– 「特定の日(通常は当日)」に点検時期を迎える住宅をSQL一発で絞り込みたい

## 環境

“`
Ruby 2.7.2 / 2.7.8
Rails 6.0.3 / 6.1.7
MySQL 5.7
“`

## 簡略化モデル

※実際にはもっといくつかのテーブルが関連しており、ArticleとInspectionMonthは直接繋がってはいないですが、その辺は省略しています。

“`ruby
# 住宅(戸建て・マンションの一室・テナント などなど)
#
# == Schema In

元記事を表示

RailsのDelegateを理解する

# はじめに
Ruby on Railsを使ったプロジェクトに配属され、Railsを学び始めた新卒エンジニアです。コードを読む中で、見慣れないDelegateメソッドを見つけたので調べてみました。
本記事の対象者はRubyやRailsの初心者、オプジェクト指向プログラミング初心者向けの記事となっています。修正点や改善点などがあればコメントまでお願いします。

# Delegateとは
あるオブジェクト(一般的にはモデルオブジェクト)から別のオブジェクトへのメソッド呼び出しを委譲するために使用されます。[定義に関してはこちら](https://github.com/rails/rails/blob/7-0-stable/activesupport/lib/active_support/core_ext/module/delegation.rb)

“`ruby: delegateの定義
delegate :カラム名, to: :委譲先のオブジェクト名
“`
また、委譲できるメソッドは複数追加することが可能です。

“`ruby: 複数のメソッドの委譲
class Order <

元記事を表示

固定長の配列を初期化する

# 概要

固定長の配列を初期化する

# 方法

`Array.new`を使う

## sample

“`ruby
Array.new(5)
=> [nil, nil, nil, nil, nil]
“`

初期値の設定
“`ruby
# 第二引数に設定
Array.new(5, 0)
=> [0, 0, 0, 0, 0]

# block でも可
Array.new(3){ “foo” }
=> [“foo”, “foo”, “foo”]
“`

2重配列
“`ruby
# blockを応用して2重配列
Array.new(3){ Array.new(2) }
=> [[nil, nil], [nil, nil], [nil, nil]]
“`

# 最後に

rubyだとあまり使わないだろうけれど、、、
`new`での初期化を覚えておくといざというときに便利かもしれない

# 追記

初期化した際のオブジェクト周りについて興味深いコメント頂いたので追加で調べて追記

引数で初期化する場合、オブジェクトが共通になっている
“`ruby
arr = Arr

元記事を表示

配列を特定数ずつに区切る

# 概要

配列を特定の数ずつに分割したい

環境:Ruby 3.2

# 方法

each_sliceってのがあった。

## sample
“`ruby
# 中身を確認
(1..10).each_slice(3) {|a| p a}
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]

# 配列にして分割されているか確認
(1..10).each_slice(3).to_a
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

# 返却はEnumerator
(1..10).each_slice(3).class
=> Enumerator

“`

元記事を表示

【個人開発】お惣菜の商談記録管理アプリ【Rails】

# はじめに
未経験でディープロ(旧:DIVE INTO CODE)に入校し、4ヶ月の受講の集大成としてオリジナルアプリケーションを作成しました。
名前は「デリレコ」と言います。
前職(お惣菜の商品開発)の経験を元にした、お惣菜の商談記録が管理できるアプリケーションです。
    
アプリケーション:https://protected-coast-48892.herokuapp.com
GitHub:https://github.com/MayuKishimoto/deli_reco.git

# なぜ「デリレコ」を作ったのか
### 結論:商品の商談記録を管理するのが大変だったから!

前職の時にはこんな悩みがありました。

**1. 商品数が多い問題**
一事業所で、月に1

元記事を表示

開発ツールに頼らず 様々な言語から WebAssembly(第4回)

WebAssembly は多くのプログラム言語からライブラリの様に呼び出す事が出来る。
WebAssembly のコードを書く方法は多くの記事で書かれているが、その使い方はフレームワーク等のツールに頼っている事が多い様だ。
本記事では、そのような便利ツールに出来るだけ頼らず JavaScript, Rust, Python, Ruby から WebAssembly を実行する方法を記載する。

WebAssembly は新しい技術である。
目先の最先端ツールに飛びつくのもよいが、その基礎を学んで長く使える知識を身に着けないか?

本記事はシリーズの第3回である。シリーズ記事の一覧は [第1回] の **#シリーズ記事一覧** に載せている。シリーズの記事を追加する時は [第1回] の一覧を更新して通知を行うので興味の有る人は [第1回] をストックして欲しい。

# 本記事の概要と過去記事の復習

[第3回] では作成する WebAssembly のコードに整数型の状態(インスタンス変数、プロパティ)を持たせた。
本記事では整数に加えて String 相当のプロパティを持たせる。

元記事を表示

Ruby Gold 3.1のテストに2回落ちました

Ruby Gold 3.1の資格を受験して、2回落ちて3回目で合格できました。
rubyのバージョンが3に上がってからの、受験記録の記事はあまり数が多くないと感じたため、受験した中で、回答に迷った問題をまとめます。
点数の履歴は、70点、68点、80点でした。

なお、バージョン3の参考記事としては、下記が非常に参考になりました。
https://qiita.com/heysan/items/82bdfb7af4325f05e0e5

# 1問目
“`ruby
a = _(1)_ # ここを問う問題
Ruby Gold
version 3
EOS
puts a

(実行結果)
Ruby Gold
version 3
“`
選択肢として、以下のようなものがでました。
1. <<~EOS 1. <

元記事を表示

【Rails API】「v1」とは何を表しているの?

Rails APIについて学習しています。

URL:`http://localhost:3000/api/v1/articles`や、
RL:`http://localhost:3000/api/v1/articles/[:id]`に、
アクセスした時のレスポンスとしてJSONを返すようなプログラムを実装しています。

その際、URLに指定する「v1」というワードが気になったので、調べてみました。

# 使用環境
– Ruby 2.6.6
– Rails 6.0.2.1
– jsonのserializer は fast_jsonapi を使用。

# テーブル
以下、モデル・テーブルを事前に準備していることを前提にしています。

– Userテーブル
– Profileテーブル
– Articleテーブル
– Commentテーブル

# 【本題】v1とは何を表しているの?

– それは一般的にAPIのバージョンを表している。
– APIの設計においては、後方互換性を壊さないように新しいバージョンを作ることがある。
– そのときに、v1やv2といった形でバージョンをURLに含めるこ

元記事を表示

この一ヶ月で学んだこと ruby周辺ver

# この一ヶ月で学んだこと
いや、この6月の一ヶ月は忙しくて、なかなか記事を更新できていませんでした。
ただ、この一ヶ月はかなり学ぶことがったので、忘れないようにまとめておきたいと思います。
Vueも入れると膨大になるので今回はrubyやその周辺に絞って書きます。

# ruby method
まずは、今回使用したrubyメソッドをまとめておこう。
今回のプロジェクトでは、ファイルをreadして、それを配列の中にオブジェクトで格納する方法でデータを取り扱った。その際に、以下のメソッドを使用して、ゴニョゴニョしたわけだ。

## strip
説明: 文字列の両端から空白文字を削除
“`
str = ” Hello, World! ”
stripped_str = str.strip
puts stripped_str
# 出力: “Hello, World!”
“`

## split
説明: 文字列を指定した区切り文字で分割し、配列として返す

“`
str = “apple,banana,cherry”
fruits = str.split(“,”)
puts fruits

元記事を表示

OTHERカテゴリの最新記事