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

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

【Ruby】puts / print / p / pp の違い 【チェリー本を読んで】

## はじめに
今回の記事は過去に「プロを目指す人のためのRuby入門」を読んで、勉強になった・意識していなかった
部分を備忘録的にまとめています。

`puts` `print` `p` `pp` のメソッドについてどれも出力に使用するものですが、
どれも挙動が少し違います

## それで、puts / print / p / pp の違いは何なの?
**結論**

| メソッド | 出力後の改行 | 配列の表示 | 呼び出すメソッド | 戻り値 | 対象者 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| puts | あり | 要素ごとに改行 | to_s | nil | 一般ユーザ |
| print | なし | 改行しない | to_s | nil | 一般ユーザ |
| p | あり | 改行しない | inspect | 引数のオブジェクト | 開発者 |
| pp | あり | 見やすく整形 | inspect | 引数のオブジェクト | 開発者|

挙動として、上記の図のようになります!
因みに `pp` の見やすく整形は配列だけではなく、ハッシュ等の大

元記事を表示

[Ruby] 初めての記号プログラミング

# 概要

Ruby はその言語の特性を利用することで,英数字を使用せずにプログラムを書ける.英数字を使用しないプログラムを書くことは,俗に記号プログラミングと呼ばれる.

この記事では,[偉大な先駆者の記事](https://qiita.com/zifre/items/951dc73ae0ee56348538)をベースに,詳しい解説を加えつつ,競技プログラミングの簡単な問題に正解するプログラムを作成する段階まで追加で説明する.

# 前提

* Ruby で FizzBuzz を書ける
* Ruby で簡単な再帰処理をかける

# 注意事項

記号プログラミングは,暇を持て余したプログラマーが個人で楽しむための遊びである.保守性や可読性が著しく低いため,仕事では使用しないこと.

# 本編

先に方針について触れると,最終的には `eval` に任意の文字列を渡すことで任意のプログラムを実行させる.そのためには文字列を生成する必要があるが,英字は使用できないため数値を使用する.よって,まずは数値を錬成する.

## 0 と 1 の錬成

Ruby で記号のみから数値を錬成する最も簡単

元記事を表示

【RSpec】備忘録:stub_constメソッド、create_listメソッド

## stub_constで定数をスタブ化する

:::note
RSpecのテストフレームワークを使用しているRubyやRuby on Railsのプロジェクトで見られるメソッドの一つ。一時的に定数の値をスタブ(つまり、偽の値に置き換える)するのに役立つ。
:::

#### 使用例
特定の定数の値に依存するコードをテストしている場合、その定数の値を一時的に変更してテストシナリオを検証することができる。

“`ruby
it “does something based on MY_CONSTANT” do
stub_const(“MyClass::MY_CONSTANT”, “fake_value”)

# このブロック内では、MyClass::MY_CONSTANTは”fake_value”として扱われる
expect(MyClass.some_method).to eq(expected_result_based_on_fake_value)
end
“`

この例では、`MyClass::MY_CONSTANT`を`fake_value`に一時的に置き換え

元記事を表示

【Rails】Qiita APIを使ってRailsに関する記事を取得する

# はじめに
お疲れさまです。
おおくまです。

[前回](https://qiita.com/kumaryoya/items/eafbc5063e60e3aaa4d5)に引き続きAPIについてです。
今回は、**Qiita API**を使ってRailsでミニアプリを作ってみました。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# アクセストークンを取得する
それでは、[Qiita APIのドキュメント](https://qiita.com/api/v2/docs)に沿って実装していきたいと思います。
まず、初めに**アクセストークン**を取得します。
アクセストークンを取得しなくてもAPIを利用することはできますが、認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までという[利用制限](https://qiita.com/api/v2/doc

元記事を表示

ransack scopeの検索キーワードとして ‘T’ が使えない

# 問題

ransackでは、ActiveRecordのscopeを用いて検索することができます。しかし、以下のように検索キーワードとして `’T’` は使えません。エラーメッセージにある通り、scopeに渡されているはずのキーワードが渡されていません。

![Sep-24-2023 23-49-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472392/4e3f26ba-85f5-3ce6-680d-540e33f2515d.gif)

## 環境

– Rails 7.1.7
– Ruby 3.2.2
– Ransack 4.0.0

# 原因

このような問題が起きるのは、`’T’` などといった真理値っぽいものは、ActiveRecordのscopeに渡される前にサニタイズされるからです。

検索キーワードとして、真っぽいものが入っていたら `true`に、偽っぽいものが入っていたら`false`に変換しています(`sanitized_scope_args`メソッドの5-8行目)。

元記事を表示

コールバックでのsaved_change_to_ と will_save_change_to

## はじめに
スクールにて、コールバックの設定に手間取り、その際調べることで挙動の違いを理解したつもりなので、同じようなことにハマった人のためになればいいなと、健忘録として残します。

### 開発環境
Rails 6.1.7.4
ruby 3.0.1

### 目的
管理者が、最後の1人のとき、管理者が0人とならないように権限の編集を制限する。
つまり、1人もいなくなっちゃ困るので、必ず1人は権限を在籍させたい訳です。

### 最初に試したこと(失敗したこと)
– Qiita記事や調べてまずは下記のように設定
“`rb
def admin_cannot_update
if User.where(admin: true).count == 1 && self.saved_change_to_admin == [true,false]
throw :abort
end
end
“`
adminに設定されたユーザーがデータベースに1人だけであり、かつ対象のオブジェクトのadminカラムをtrueからfalseに変更しようとしたとき、 thow :abortで更新を中

元記事を表示

【個人開発】LINEMessagingAPIを使って無差別に飯テロできるアプリを作りました

# はじめに
こんにちは、すずゆーと申します。

突然ですが皆様は飯テロをしたことはありますでしょうか。
私はSNSに美味しいご飯をアップするのが大好きです。
アップした写真に対してフォロワーさんからの反応を楽しむのが大好きです。

しかし、SNSだとせっかくアップしても本当に見てもらいたい人に見てもらえない時があったり…
そんな中、LINEなら確実に相手に届くし見てもらえるじゃん!ということで私の悪戯心を具現化したアプリを開発しました。

## 記事を読む上での注意点
当記事はプログラミング学習を開始して日の浅い業界未経験者が書いたものになりますので、技術的な内容などは誤りを含む可能性があります。予めご了承ください。

# サービス名

### 飯テログ
URL: https://meshitelog.com
GitHub: https://github.com/suzuyu0115/meshitelog
![placeholder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493892

元記事を表示

【Ruby】ブロックとyield・Proc・lambda

# はじめに

`yield`、`Proc`、`lambda`、こいつらを目にするたびに

1. 「何だったっけなぁ、ブロックを扱う概念だった気がするけど、よくわからん」
2. 調べて、軽くコードを書いて実行してみる
3. わかった気がして満足する
4. しばらく使うこともなく、1へ戻る

を繰り返していました。

そもそも「ほとんど使うことがない」というのも、理解が不十分だから使える場面を見逃しているのではないかという気もしてきたので、ここらで記事にまとめて、理解を深めていこうと思います。

実際にコードを書きながら挙動を確認していくので、似たようなことを感じている方はぜひ、手を動かしながらご覧ください!

「公式ドキュメントを読めばわかるだろ!」という話かもしれませんが、やっぱり自分でコードを書いて(さらに気になったことを思いつくまま試した方が)理解が深まると思います。

# 目次

– [検証環境](#検証環境)
– [ブロック](#ブロック)
– [yield](#yield)
– [Proc](#proc)
– [lambda](#lambda)
– [Proc.newとla

元記事を表示

rails非同期処理 gem比較

実務で扱っているアプリケーション(Rails)に非同期処理を導入することになり、代表的なgemの特徴・メリット・デメリットを調査しました。せっかくなので簡単にまとめておきます。

## 調査対象のgem
– Sidekiq
– Shoryuken
– Rescue
– Delayed_job

## 比較表
GitHubスター数は2023年9月頃のものです。また「〇、△、✕」は条件次第で変わってくるものもあると思います、参考程度の認識でお願いします。

【Rails】診断機能をラジオボタンを使って実装!


## 【Rails】診断機能をラジオボタンを使って実装!

今回はRuby on Railsで診断機能を実装します!
その時にチェックボックスではなくてラジオボタンを使って実装してみようと思います!
目次は以下の通りです!

### 1. コントローラー設計
### 1. データベース周り
### 1. Viewページ周り
### 1. ルート周り

## 1. コントローラー設計

“`ruby:travels_controller.rb
class TravelsController < ApplicationController def index end def new @travel = Travel.new end def show @travel = Travel.find_by(id: params[:id]) end def create @travel = Travel.new(travel_params) if @travel.save flash[:notice]

【初学者】API?パース?なにそれ?おいしいの?

# はじめに
お疲れさまです。
おおくまです。

今回は、個人的に私が苦手意識を持っている「**API**」と「**パース**」と向き合いました。
Railsでミニアプリを作りながら、理解を深めてみました。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# APIとは
「**API**」とは、「**Application Programming Interface**」の頭文字です。
**インターフェース**とは、コンピュータ用語でいうと、「何か」と「何か」をつなぐものという意味を持ちます。
**つまりAPIとは、アプリケーション、ソフトウェア、プログラムなどをつなぐものという意味になります。**
APIを利用し、そのアプリケーションと連携することで、自分で1からプログラムを組む必要がなくなり、アプリケーション開発の効率化がはかれます。
アプリケーション開発側にとって、開発時間を短縮することができるのは大きな

配列に格納されたハッシュを複数条件でソートしたい

# やりたいこと

まずは、`sort`メソッドを使い、以下の配列をheightの昇順(背の低い順)でソートします。

“`ruby
people = [{ name: ‘Sato’, weight: 20, height: 180 },
{ name: ‘Suzuki’, weight: 30, height: 170 },
{ name: ‘Ito’, weight: 60, height: 160 },
{ name: ‘Watanabe’, weight: 50, height: 150 }]
“`

その後で、**複数条件でのソート**(マルチソート)を試します。
例として、heightが同じ数値の場合はweightの降順(体重が上の順)でソートするようにします。

`sort_by`を使った書き方も最後に紹介します。

## sortメソッドを使用

### heightの昇順でソート

配列の並び替えには[sortメソッド](https://docs.ruby-lang.org/ja/latest/m

RailsのRubyライブラリ自動読み込みについて | なぜrequireしなくても動くのか?

Railsでアプリを開発中、外部APIを叩く処理で[URIライブラリ](https://docs.ruby-lang.org/ja/latest/library/uri.html)を使用する場面がありました。

URIライブラリは[組み込みライブラリ](https://docs.ruby-lang.org/ja/3.1/library/_builtin.html)ではないので、コード内に`require ‘uri’`が必ず必要だと思っていたのですが、require無しでも動いたため、その理由について調べたことをまとめます。

## Rubyライブラリの種類

本題に入る前にRubyライブラリの種類について簡単に。

#### ①組み込み標準ライブラリ
– Ruby本体に組み込まれている。
– require を書かなくても使うことができる。
– 例)Array, Hash, String, Integer

#### ②組み込みではない標準ライブラリ(この記事で扱います)
– Ruby本体に付属している。
– インストール不要でコード内でrequireして使う。
– 例)Date,

has_secure_password の 72 文字制限にご用心

Rails にはパスワードフィールドを管理する方法として `has_secure_password` という機能がある。機能自体については[公式のドキュメント](https://guides.rubyonrails.org/active_model_basics.html#securepassword)を参照してほしい。

本題はこの機能の 72 文字制限についてである。公式のドキュメントにもある通り、この機能が作るパスワードフィールドには最大 72 文字のバリデーションが自動的にかかる。

“`irb
irb> user.password = user.password_confirmation = ‘a’ * 73
irb> user.valid?
=> false
irb> user.errors
=> #72}>]>
“`
[ソースコード]( https://github.com/rai

Railsで静的データのモデルの実装

## 最初に

本記事でやりたかったことは [active_hash](https://github.com/active-hash/active_hash) を使ってもできるので、その前提でお読みいただけると。

記事を書いたときは `active_hash` を知らず、コメントで教えていただきました。

## 背景
Ruby on Railsで開発をしていて、
更新性の低いデータ、DB管理する必要ないであろうデータの扱い方に迷ったので、
対応方法を残します。

## 対象データ
Webサービスのプラン情報についてです。
基本的にリリース後に追加はあっても変更する可能性は低いです。
追加に関してもあっても2年に一度とかとかになるかな..と考えています。

ですので、管理画面作って変更するまでもないし、
DBに入れるまでもないデータだなと思ってどのように実装するかを迷っていました。

## 対処方法
Modelとしては実装しつつも、
DBには保存せず静的なデータで定義をしました。

## 実際のコード

以下のModelクラスを実装です。

“`models/plan.rb
clas

BundlerとRubygemsの依存性によるトラブルシュート

## 環境
Ubuntu20.4
Ruby2.6.0

## はじめに

自分の開発環境から別の環境にRailsのソースを移行して、bundlerを動かそうとしたところ、動かないといった問題に遭遇したため、そのトラブルシュートの記事です。

Bundelrの公式サイトのBlogによると、この問題に関する是正内容が、2019年1月4日の記事で発表されています。わりと古い内容なので、今更な話題ではあります。

https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html

## 内容

Bundlerのバージョンを確認したところつぎのエラーが発生しました。
“`
$bundle -v
Traceback (most recent call last):
2: from /usr/local/rbenv/versions/2.5.0/bin/bundle:23:in `


1: from /usr/local/rbenv/versions/2.5.0/lib/

rails 通知機能

**はじめに**

今回は、投稿のいいね機能についての通知機能を実装します。

バージョン
rails 6.1.7.4
ruby 3.1.2
通知する機能いいね機能作成済みとします
________

### モデル作成
“`
rails g modle Notification
“`
“`notification.rb
class Notification < ApplicationRecord # デフォルトの並び順を「作成日時の降順」で指定、に新しい通知からデータを取得することができる default_scope -> { order(created_at: :desc) }
belongs_to :visitor, class_name: ‘User’, optional: true
belongs_to :visited, class_name: ‘User’, optional: true
# optional: trueは、nilを許可するもの
belongs_to :post, optional: true
belongs_to :c

Multiscale 23f

# name

Multiscale 23f : ソフトウェア開発での必須スキルとなるTDD(test driven development, テスト駆動開発), class, refactoringを,Ruby言語で習得する

# text

Kent Beck, ‘Test-Driven Development by Example’, (Pearson, 2003).

# Schedule

| data | text | title

俺流Request specのフォーマット

## 背景

最近、個人でRuby on Railsを使ってWebサービスのAPIを開発しています。
その際にRSpecを使って主にRequest specを書きました。
spec形式の書き方で試行錯誤したので公開してみます。

## 俺流Request spec

まずは、コードを共有させていただきます。

組織のCRADを実装したOrganization APIのrequest specです。
rails_helperやメソッドに処理をさせているところもあって、
わかりづらいかもしれませんが動いているコードの一部をほぼそのまま持ってきました。

“`organizations_request_spec.rb
RSpec.describe ‘Organizations’, type: :request do
# 共通のデータ
let!(:user) { create(:user) }
let!(:uneditable_user) { create(:user) }
let!(:organization) { create(:organization) }

le

Passengerで複数のRubyのバージョンに対応する

## 環境
– Ubuntu20.4 + Vagrant
– Ruby2.6.0
– Apache2.4.41
– Passenger6.0.18

## はじめに

Apache2 + Passengerの環境で、異なるRubyのバージョンで作られた複数のWebアプリを、共存させて動作させる方法について書きました。もう少し詳しく言えば、Ruby2.7で作られたWebアプリと、Ruby2.6で作られたWebアプリとを、Passengerで共存させる環境の作り方についてということです。

## 内容

#### Passengerのバージョンを確認する

Passengerが複数のRubyバージョンに対応できるようになったのは、Passenger4.0.0以降です。まずは、既存のPassengerのバージョンを確認します。

“`
$passenger-config –version
“`

Passengerがインストールされているはずなのに、「コマンドがありません」というエラーがメッセージが表示される場合は、パスが切れていない可能性があります。その場合は、自力でコマンドがある場

Sidekiq Shoryuken Rescue Delayed_job
GitHubスター数 12.7k 2k 9.3k 4.8k