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

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

Ruby on Railsアップデート(ErrorReporter#unexpected/with_routingテストヘルパー 他 2023-11-24)

## 引用元
https://world.hey.com/this.week.in.rails/errorreporter-unexpected-with_routing-test-helpers-and-more-1b2c56f6

## 今週のトピック

### [ErrorReporter#unexpectedを本番環境ではreportし開発環境ではraiseするようにする](https://github.com/rails/rails/pull/49951)
https://railsguides.jp/error_reporting.html
この変更により、前提条件違反を報告する`ErrorReported#unexpected`が追加された。

例えば、以下のコードではdevelopment環境とtest環境ではエラーをraiseするが、production環境ではエラーをreportする。
“`
def edit
if published?
Rails.error.unexpected(“[BUG] Attempting to edit a pub

元記事を表示

【Rails】text_fieldにカンマ入り金額が入力され1円で出品されそうになった話

## 経緯
ECサイトにシステムから1800ドルで出品する処理を行ったところ1ドルで出品されるという報告を受ける。
⇨検証のため同じ環境で同じ価格で出品したところ、正常に出品される。
⇨原因がわからない。
という事象が発生。

## 原因
出品テストの担当に聞いたところ1800ドルが1ドル、2200ドルが2ドルになっているとのこと。
ここで「入力値にカンマやピリオドが入っているのでは」と気付く。

入力欄を確認するとnumber_fieldではなくtext_fieldとなっており、
価格を1,800ドルで出品してみると、1ドルで出品される現象が再現された。

## いろいろ確認してみた
今回の対処としてはtext_fieldをnumber_fieldに修正し、
数字以外入力不可能とすることで完了したが、
int型,decimal型で文字列を含む数字を受け取った時の挙動を確認してみた。

1,000 → 1
1,000円 → 1
10,000 → 10
¥10,000 → 0
いちまんえん → 0

先頭から文字列までの数値が保存されるようだ。

## まとめ
価格、数量など数値しか扱わ

元記事を表示

Sinatra アプリで Sass の処理を行う一手法

もっと良いやり方があるかもしれないけど。

# 動機

Sinatra で Sass を使うには,

“`rb
get “/hoge.css” do
sass :hoge
end
“`

みたいな感じ書いてやればいいのだが,この `sass` メソッドを使う方法は [sass](https://rubygems.org/gems/sass) gem もしくは [sassc](https://rubygems.org/gems/sassc) gem を使うことが前提になる(たぶん)。
両 gem は既に開発を終了しており,イマドキの Sass 仕様(`@use` とか)には対応していないので,新規プロジェクトでは使いたくない。

Ruby でイマドキの Sass を使うには,[sass-embedded](https://rubygems.org/gems/sass-embedded) gem を採用するのがよいと考えている。

Sinatra では,CSS など静的なもの(動的生成しなくよいもの)は `public` ディレクトリーに入れておけばよく,上記のような `get`

元記事を表示

Go:レシーバについて解説(Rubyとの違いも合わせて解説)

# はじめに
レシーバは一般的に利用される関数と違い形式がわかりづらいです。
本記事を読んでいただき、レシーバの理解に役立てていただければ幸いです。

# レシーバとは
レシーバは特定の型に対するメソッドを定義する際に使用されます。
メソッドが操作する主体を指し、メソッドがどの型に属するかを定義します。

# レシーバの書き方
“`go
package main

import “fmt”

// 1. 型の定義:
// type ~ structは、Rectangle構造体を定義しています。Rectangleは長方形を表します。
type Rectangle struct {
Width, Height int
}

// 2. レシーバを持つメソッドの定義:
// Rectangle構造体に対するAreaメソッドを定義しています。これは長方形の面積を計算します。
func (r Rectangle) Area() int {
return r.Width * r.Height
}

func main() {
// 3. Rectangle構造体のインスタンスを作成

元記事を表示

【Ruby】n 人を m 班に分ける

# お題

長さ `n` の配列があるとする。
配列の要素は,まあ何でもいいんだけど,人を表しているとする。
簡単のため,

“`rb
persons = [“Alice”, “Bob”, “Carol”, “Dan”, “Emily”, “Finn”]
“`

としよう。

これを**均等に** `m` 個に分割したいとする。要する班わけですな。

さきほどの `persons` を 3 班に分けるなら,たとえば

“`rb
[
[“Alice”, “Bob”],
[“Carol”, “Dan”],
[“Emily”, “Finn”]
]
“`

みたいな二重配列が欲しいわけだ。

一般には `n` が `m` で割り切れるとは限らないので,班によって人数が異なりうる,ということに注意しよう。
その場合でも,なるべく人数が揃うようにしたい。

# 班の最大人数は ceil(n/m)

なるべく人数が均等になるようにするなら,班の最大人数は

“`math
\left\lceil \frac nm \right\rceil
“`

となる。($\lceil\h

元記事を表示

初めてのRspecで学んだこと

課題で出てきて、初めて取り組んだRspec!
色々なポイントを学んだので備忘録として残しておく。
初学者なので、間違ってる点などあればご指摘下さい。

“`
ruby 3.2.2
rails 6.1.7.6
“`
作成しているアプリはタスク管理アプリ

## SystemSpecの基本
### Factoryを使用したテスト
Factoryとは、railsでテストをする時用のテストデータを作成してくれるテンプレートのこと。
factory_bot_railsというgemをインストールすることで使用できるようになる。
(Factoryを使用する手順(インストール方法など)は今回は省略。)
今回のタスク管理アプリで、「一覧画面に遷移した場合」→「作成済みのタスク一覧が表示される」というテストコードを書く際、Factoryを使用した。

“`spec/factories/task_spec.rb
FactoryBot.define do
factory :task do
name { ‘パパ’ }
content { ‘日曜日歯医者’ }
end
end
“`

元記事を表示

【OpenAI】RailsでChat GPTを導入しよう

## はじめに
どうもこんにちはもきお([@mokio_50](https://twitter.com/mokio_50))です。突然ですが皆さんはChat GPTは好きですか? 自分は大好きです。

どれほど開発の手助けになってきたことか。そんなChat GPTを会社のシステムとAPI連携することになりました。その機能開発を担当したので今回はRailsでChatGPTのAPI連携する流れを記事にしたいと思います。

## 目次
1. APIキーの発行
2. 今回の実装イメージ
3. 実装
4. 検証

## 1. APIキーの発行
外部APIとの連携を行うためにはAPIキーが必要になります。以下の記事が参考になりました。

【画像付き】OpenAI(ChatGPT)のAPIキー取得手順

## 2. 実装イメージ
通常の外部API連携だと例えば法人番号を取得できるAPIと連携するとしましょう。その場合法人番号が取得できるリクエストを作成し、返ってきたレスポンスに対して整形し表示なりデータベースに保存するなりする流れになるかなと思います。

今回はChat機能

元記事を表示

素因数分解をするrubyスクリプト

素因数分解をするrubyスクリプトです。
`chmod +x factor.ruby`
`./factor.ruby `
として動かしてください。

“`factor.ruby
#!/usr/bin/ruby
def primefactorization(n)
if n==0 || n==1
return []
end
i=2
f=[]
while n!=1 do
if n%i==0
f+=[i]
n/=i
else
i=i+1
end
end
f
end

n=ARGV[0].to_i
f=primefactorization(n)
print n,”:”,f,”\n”
“`

元記事を表示

ebay出品時のコンディション設定について

## コンディションについて
コンディションとはヤフオクで言う「新品」「中古」「可」など商品の状態を指すものであり、
eBayへ出品を行う際、一部のカテゴリを除き指定が必須となっています。

じゃあ指定すればいいだけの話じゃん。となりそうですが実はeBayのコンディションは
ヤフオクのようにどの商品でも共通しているわけではなくカテゴリによって
選択できるコンディションが異なっています。

例えば下表の赤枠は食品ですが、こちらは「New」しか選択できないのに対し
青枠のカメラ等は非常に多くのコンディションが選択できます。
![スクリーンショット 2023-11-26 0.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/5d56ae5e-2d5a-a19b-1b28-d4ca73845e65.png)
_[eBayドキュメント](https://developer.ebay.com/devzone/finding/callref/enums/conditionidlist.ht

元記事を表示

Tinker Board S R2.0 にRuby 3.2を入れるまでのメモ

## apt-get update

“`
$ sudo apt-get update
Get:1 http://ftp.jp.debian.org/debian buster InRelease [122 kB]
Get:2 http://ftp.jp.debian.org/debian buster-updates InRelease [56.6 kB]
Get:3 http://ftp.jp.debian.org/debian buster-backports InRelease [51.4 kB]
Get:4 http://security.debian.org buster/updates InRelease [34.8 kB]
Get:5 http://security.debian.org buster/updates/main armhf Packages [565 kB]
Get:6 http://security.debian.org buster/updates/main Translation-en [309 kB]
Get:7 http://security

元記事を表示

Ruby Gold 3.1を受けた感想。出題傾向/対策まとめ(2023年11月)

### はじめに
2023年11月にRuby技術者認定試験Goldを受験しました。
結果は96点でした。

test

ある程度余裕をもって合格することができたので、以下を公開することにしました。
1. 実際に出題された問題例
1. 受験に向けて実施したこと
1. 対策としてまとめていた点

念入りに対策して臨んだこともあり、試験で解答に迷う問題はありませんでした。
私のように余裕を持って合格したい方は、こちらの記事を参考にしていただければと思います。

### 受験に向けて実施したこと
#### 勉強期間
Silver合格後、1ヶ月間(70H)ほど勉強しました。
– 10月28日 Ruby技術者認定試験 Silver 受験
– 11月23日 Ruby技術者認定試験 Gold 受験

#### 参考にしたサイ

元記事を表示

エラトステネスの篩で素数を出力するRubyスクリプト

エラトステネスの篩で素数を出力するRubyスクリプトです。

`chmod +x sieve.ruby`して、
`./sieve.ruby 1000` として実行して下さい。

“`sieve.ruby
#!/usr/bin/ruby

def sieve(n)
tab=(2..n).to_a
l=[]
while l.push(tab.shift).last do
tab.reject!{ |x| x%l.last==0 }
end
l[0..-2]
end

primes=sieve(ARGV[0].to_i)
p primes, primes.length
“`

実行結果

“`
$ ./sieve.ruby 1000
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167

元記事を表示

bcryptGemを用いたパスワードのハッシュ管理

# bcryptGemを用いたパスワードのハッシュ管理

Webアプリケーションのセキュリティを確保する上で、パスワードの安全な管理は重要な役割を果たします。`bcrypt` Gemを使用することで、Railsアプリケーションにおいて、パスワードを安全にハッシュ化し、管理することが可能です。この記事では、`bcrypt` Gemを使用したパスワードのハッシュ化と認証プロセスについて詳しく解説します。

## bcryptGemとは

`bcrypt` Gemは、パスワードのセキュリティを向上させるために使用されるRubyのライブラリです。このGemは、パスワードをハッシュ化することで、データベースに平文のパスワードを保存するリスクを回避します。

### パスワードのハッシュ化

– ユーザーがパスワードを設定すると、`bcrypt` Gemはそのパスワードをハッシュ化します。これにより、実際のパスワードとは異なる、独特な文字列が生成されます。

## has_secure_passwordの利用

Ruby on Railsでは`has_secure_password`メソッドを使用

元記事を表示

DeviseGemを使わないログイン機能の実装方法

# DeviseGemを使わないログイン機能の実装方法

Webアプリケーションにおいて、ユーザー認証機能はセキュリティとユーザーエクスペリエンスを確保するために不可欠です。しかし、すべてのプロジェクトでDeviseGemなどの認証フレームワークを使用するわけではありません。ここでは、DeviseGemを使わない基本的なログイン機能の実装方法を解説します。

## サインインとログインの基本的な仕組み

### セッションの利用

– ユーザーがログインすると、そのユーザーのIDがセッション変数に保存されます(`session[:user_id] = @user.id`)。
– ブラウザはこのセッション情報を受け取り、以降のリクエストにセッションIDを含めてサーバーに送信します。
– サーバー側はセッションIDを確認し、それに基づいてユーザーがログイン済みであるかどうかを判断します。
– ユーザーログアウトして際は、ユーザーのIDをセッションから剥奪します(`session[:user_id] = nil`)。

### カレントユーザーの設定

– セッションに保存されているユーザー

元記事を表示

【ActiveRecord】find・find_by・whereの違いと主要メソッド

# 【ActiveRecord】find・find_by・whereの違いと主要メソッド

Ruby on Railsの強力な機能の一つであるActiveRecordは、データベースの操作を簡単かつ効率的にするORM(Object-Relational Mapping)システムです。この記事では、ActiveRecordの基本的な使い方、特に`find`、`find_by`、`where`メソッドの違いに注目し、New、Create、Update、Delete、Saveといった主要メソッドの概要を解説します。

## ActiveRecordの概要

ActiveRecordは、Ruby on RailsのMVCモデルの中でモデル層を担当し、データベースとの間でデータをやり取りする役割を果たします。SQLを直接書く代わりに、Rubyのメソッドを使用してデータベースを操作することができます。これにより、コードの可読性が向上し、データベース操作が容易になります。

## find・find_by・whereの違い

### findメソッド

`find`メソッドは主にIDに基づいてレコー

元記事を表示

オブジェクト指向の再利用部品群の概要

## はじめに
オブジェクト指向がもたらした再利用部品群の、
クラスライブラリやフレームワークについて理解する。

## クラスライブラリ
 汎用的な機能を持つクラスを集めたもの。

 クラスライブラリには2種類あり、
 プログラミング言語に標準で付属するものと、サードパーティ製のものである。

### 1. プログラミング言語に標準で付属するもの
 Rubyなどの言語は、
 言語仕様を最小に抑え必要な機能をライブラリとして提供している。

:::note info
利点:
・文法や構文がシンプルになることで、言語学習や理解が容易になる。
・新機能をライブラリで実装するため、言語仕様のバージョンアップが必要ない。
:::

#### 言語標準クラスライブラリは継承構造
 言語標準のクラスライブラリは継承構造になっており、
 最上位の唯一のクラス(基底クラス)が存在する。

:::note info
基底クラスは言語により名称は異なる。
例えば、JavaではObject、Pythonではobject、RubyではBasicObjectである。
:::

 基底クラスには、

元記事を表示

Rubyでgets.chompについて

入力されたコメントを出力し、「終了」が入力されたら「終了します」と出力して終わるプログラムを作成します。

「終了」入力されるまで繰り返すので
“`
while true
end
“`
を使って繰り返して
“`
break
“`
で抜ければいいので
“`
while true
comment = gets
if comment != “終了”
puts “あなたのコメント: #{comment}”
else
puts “終了します”
break
end
end
“`
と記述しました。

しかし

#### 「終了」を入力したのに止まりません💦

そこで、`gets`の後ろに`.chomp`を追記して
“`
while true
comment = gets.chomp
if comment != “終了”
puts “あなたのコメント: #{comment}”
else
puts “終了します”
break
end
end
“`
と変更すると

#### 無事「終了」で終わることができま

元記事を表示

Arrayオブジェクトの基礎

## `Array`オブジェクトの基本的な使い方

`Array`オブジェクトとは配列とも呼ばれ、複数の順番に並べて保持できるオブジェクトです。

#### [Array](https://docs.ruby-lang.org/ja/latest/class/Array.html)の基本的な使い方は以下の通りです。

“`
array = [1,2,”aaa”,4]
“`
(ここで言うarrayはただの変数です。arrayじゃなくてdoraemonでも何でもOKです。)

### 実際に活用してみよう!
#### Arrayの中のひとつを参照したいとき
“`
array = [“nobita”, ”sizuka”, ”suneo”, ”gian”]
puts array[gets.to_i]
“`
“`
#実行結果
2
suneo
“`

#### 要素を末尾に追加
>Arrayオブジェクト << "要素" ``` array = ["nobita", "sizuka", "suneo", "gian"] p array << gets.chomp

元記事を表示

【minitest】 request.refererを使用する方法

# はじめに
最近`request.referer`という便利なものがあることを知り、使用する機会がありました。
ですが、minitestを書いている際にリファラを用いたアクションのテストがうまくいかず少し苦戦してしまったため、備忘録を兼ねてここに残しておこうと思います。

# そもそもrequest.refererってなに?
リクエストヘッダーが持っている情報の一つであり、遷移前のURLを取得することができます。

そのため、`request.referer`を活用することで、
– どのページからの流入なのかアクセス解析ができる
– 遷移元のURLに戻りたい時にリダイレクト先として使用できる

といったメリットがあります。

今回は後者のように、`request.referer`をリダイレクト先として使用した時の、minitestの書き方について考えます。

# minitestでのrequest.referer
ここでは`request.referer`を使用して、遷移元のURLに再度リダイレクトするようなアクションのテストを作成することを考えます。

“`rb
# get

元記事を表示

【Rails】ポリモーフィックが便利〜

どうもこんにちは。

今回はポリモーフィックについてまとめます。

# ポリモーフィックってなんぞや?

ポリモーフィックとは、複数のモデル同士の関連付けの考え方です。

この考え方は、異なるモデルを単一の関連で扱う機能です。

例えば、以下のようにテーブルが存在しているとします。

commentsテーブル
| カラム名 | 型 | 値1 | 値2 | 値3 |
| — | — | — | — | — |
| id | integer | 1 | 2 | 3 |
| comment | text | ワンちゃんかわいい!! | よろしくお願いします。 | この時期寒くね? |
| article_id | integer | null | 1 | null |
| photo_id | integer | 2 | null | null |
| tweet_id | integer | null | null | 1 |

articlesテーブル
| カラム名 | 型 | 値1 | 値2 |
| — | — | — | — |
| id | in

元記事を表示

OTHERカテゴリの最新記事