Ruby関連のことを調べてみた2022年11月05日

Ruby関連のことを調べてみた2022年11月05日
目次

Guardの自動テストがRunningのまま動かない【Windows・Railsチュートリアル3章】

Cloud9使わずローカル環境で実施していたせいか、チュートリアルに記載の通りに行ってもGuardがうまく動かなかった。
解決策をメモしておく。

# 概要
下記リンク、「3.6.2 Guardによるテストの自動化」に記載されているGuardの初期化、Guardfileの編集を行ったものの、自動テストが完了しなかった。
https://railstutorial.jp/chapters/static_pages?version=6.0#sec-guard

こんな感じで `Running: ~` のあと `[1] guard(main)>` と出たまま動かない。
“`
00:52:47 – INFO – Running: test/controllers/static_pages_controller_test.rb
[1] guard(main)>
“`
待っていれば結果が出てくるのかな?と思ったが、いつまで経っても何も起こらなかった。

念のため `spring stop` コマンドも実行したが、
“`
Spring is not running
“`
と言われるだけで、再

元記事を表示

Railsでバージョン指定してのプロジェクト作成に失敗した時の対処法

# 課題

Rails 6.1.4.4でプロジェクト作成しようと

“`
rails _6.1.4.4_ new project_name
“`

を走らせるが以下のようなエラーが出力される。

“`
`find_spec_for_exe’: can’t find gem bundler (>= 6.1.4.4) with executable bundle (Gem::GemNotFoundException)
“`

# 仮説

以前はこれでプロジェクトを作成できていたのですが、以前沼に嵌った時にRailsのバージョンを消去した記憶がうっすらあったのでその時に6.1.4.4を削除していたかもしれない。

# 解決方法

– Rails 6.1.4.4を再度インストール

“`
gem i -v 6.1.4.4 rails
“`

で解決しました。

以下の記事が参考になりました。

https://qiita.com/tanakayo/items/7b85261924eca1a5a3d6

# 結論

必要なバージョンがインストールされていなかっただけでした。

なかな

元記事を表示

エラーメッセージについて

## 初めに
エラーメッセージの実装の仕方について簡単に記録のために書いておこうと思います。

## viewに記述

“`app/views/users/_errors.html.erb
<% if @user.errors.any? %>
<%= @user.errors.count %>件のエラーが発生しました

    <% @user.errors.full_messages.each do |message| %>

  • <%= message %>
  • <% end %>

<% end %>
“`

今回はuesrのeditに部分テンプレートで表示させたいのでこのように記述します。
<%= @user.errors.count %>件のエラーが発生しましたの部分で例えば3件記述の忘れがあれば3件のエラーが発生しましたとviewに表示されるようになります。

## 実際にeditに記述
“`app/views/users/edit.html.erb

ユーザー情報編集

<%= render 'users/err

元記事を表示

[Ruby] 二次元配列の降順ソート

# 環境

Ruby3.1.2

# やりたいこと

二次元配列(中身は降順に値が入っている配列)を降順ソートしたい。

## コード

“`ruby
record_array = [
[100,50,75,50,50].shuffle,
[100,95,50,50,50].shuffle,
[99,95,95,95,95].shuffle,
[101,1,1,1,1].shuffle,
[80,75,75,60,60].shuffle,
[80,75,75,75,75].shuffle,
[75,75,75,75,75].shuffle]

# 降順に並べる
record_array = record_array.map do |row|
row.sort.reverse
end

p record_array.sort.reverse

#=>
[[101, 1, 1, 1, 1], [100, 95, 50, 50, 50], [100, 75, 50, 50, 50], [99, 95, 95, 95, 95], [80, 75, 75, 75

元記事を表示

Ruby Threadの非同期処理で処理結果をそれぞれ変数に入れて結果を待ち受ける

“`rb
thread1 = Thread.fork { sleep 3; “AAA” }
thread2 = Thread.fork { sleep 6; “BBB” }

thread_return1 = thread1.join.value
p thread_return1 # 3秒程度で表示される

thread_return2 = thread2.join.value
p thread_return2 # 6秒程度で表示される

“`

# ここでいうjoinとは

配列のjoinとはニュアンスが違うらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/06bf34f2-2da5-1d53-144f-7db5dd53265e.png)

https://docs.ruby-lang.org/ja/latest/class/Thread.html#I_JOIN

# チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用くだ

元記事を表示

【個人開発】300円以内でおやつを選ぶアプリを作りました【えんそくのおやつは300えんまで!】

# はじめに
はじめまして。
山田貴俊と申します。
先日「えんそくのおやつは300えんまで!」というアプリケーションをリリースしました。
内容は単純、300円以内でおやつを選ぶアプリです。



```

↓HTMLにべた書きすべき「ルート3」はMathJaxではこのように記述するので・・・

```html
3
```
↓これをこんなふうにHTMLにべた書きすると・・・
```ruby:quiz.html.erb

元記事を表示

AWS(S3)に画像をアップロードする

# はじめに
AWS(S3)に画像データを保存する必要性や手順をまとめたいと思います。
現状、herokuを用いてアプリのアップロードを行なっていますが、アップロードされた画像はアプリケーションのディレクトリに保存されていました。
しかし、ユーザーがアップロードした画像データは、アプリがデプロイまたは再起動(24時間に1回自動で行われる)される度に、消えてしまう仕様になっています。
そこで、ストレージサービス(画像等の膨大になるであろうデータを別途保管できる場所、サービスのこと)を利用することで、画像を長期的に保存することができるようになります。
ストレージサービスには様々な種類がありますが、今回はAWSが提供しているS3というサービスを使用します。

## S3(Amazon Simple Storage Service)とは
S3とは、AWSが提供するサービスの一つです。
(インターネット上にデータを保存する箱を借りられるサービスであるとイメージをすると良い。)
S3を利用することで、画像を保存したり、保存してある画像を取得したりすることができます。
S3に保存されたデータは実在の

元記事を表示

Rubyの繰り返し処理の速さをベンチマークで調べてみた

# はじめに
Rubyの繰り返し処理の速さが気になったのでベンチマークで調べてみました。
whileを使うと速いと聞いたので、他の繰り返し処理も使い、実際に検証してみました。
Rubyのモジュールとして提供されているBenchmarkを使用してプログラム実行時のCPU処理にかかった時間を知ることができます。

# 繰り返す内容

1から3,000,000までの範囲の数値を加算していきます。
つまり↓のようになります
1 + 2 + 3 + 4 ・・・・・ 2999998 + 2999999 + 3000000 = 4,500,001,500,000
# コード
```
require 'benchmark'

Benchmark.benchmark(Benchmark::CAPTION, 10, Benchmark::FORMAT) do |x|
x.report("each: ") {
counter = 0
[*1..3000000].each do |i|
counter += i
end
}

x.re

元記事を表示

【Ruby ブロック引数】メソッド.(&block)の引数の「&」ってなに?

# はじめに
```
def block_execute(&block) # ← ここの引数の「&」の意味がわからない
puts "block.call"
end

block_execute do
puts "blockを実行"
end
```
def block_execute(&block)
これを見て、(&block)ってどんな引数だよ!!

と思ったので調べました。

# 結論
(&block)の「&」がついた引数は、ブロック引数と呼ばれるものです。

# 解説
ブロック引数の前にブロックとは何か?

### ブロックとは?
メソッド実行時に、そのメソッドの引数として渡せる「処理のかたまり」のこと。
今回で言うとここ↓
```
block_execute do
puts "blockを実行"
end

または、
block_execute { puts "blockを実行" }
```

ブロックは
* do ~ end で囲まれた処理のかたまり
* {} で書くことも可能
* メソッドに渡すためだけに存在する

### ブロック引数とは?
ブロックを受け取る専

元記事を表示

kaminariを使ったページネーションの作り方

## 初めに
Gemfileに下記のkaminariを追加してあげます。
追加したらbundle installを忘れないようにしましょう。

```
gem 'kaminari','~> 1.2.1'
```
```
$ bundle install
```
bundle installをしたら次にkaminariの設定ファイルを作成する為に下記のコマンドをターミナルに打ち込みます。
```
$ rails g kaminari:config
```
最後に、kaminariが利用するテンプレートを作成してあげます。
```
$ rails g kaminari:views default
```
これでひとまず準備は完了です。

## 次にControllerに記述
例としてindexで記述しています。
```app/controllers/books_controller.rb
def index
@books = Book.page(params[:page]).per(9)
end
```
上記のようにpage(params[:page]).per(9)を付け足してあ

元記事を表示

【備忘録】【Rails】initializeメソッドの使い方

自分用のメモです。

# initializeメソッドとは(一言で)

- コンストラクタのこと。

# コンストラクタとは
- オブジェクトを生成した際に1度だけ実行される機能を指す名称。
- なお、オブジェクトが生成された際にのみ実行されることから、そのオブジェクト内で共通に使えるインスタンス変数の初期化などに使われる。
- ただしクラスを定義した際、コンストラクタを必ず作る必要はない。
- コンストラクタが定義されていなくてもオブジェクトを生成できる。
- また、Rubyではオブジェクトを生成するnewメソッドの引数を利用して、コンストラクタによる変数の初期化も可能。

# initializeメソッドの特徴

- initializeメソッドを定義しておくと、インスタンス生成時に必ず実行したい処理をメソッドを呼び出すことなく実行することができる。
- 例えば次の例では、initializeメソッドの中でインスタンス変数の初期化を行っている。

```ruby:
class Car
def initialize()
@name = "未定義"
end
end

c

元記事を表示

【備忘録】【Rails】クラスメソッドとインスタンスメソッドの違い

クラスメソッドとインスタンスメソッドの違いについて、曖昧な理解だったため、今回改めて勉強しました。

# クラスメソッドの特徴

- クラス内で def self.メソッド名 〜 end で定義する
- クラスから直接データを呼び出すことができる
- あるモデルクラス全体に対し、情報を変更したり、参照したりするメソッドを作成するときに使うと便利
- 例えば「User」クラスを作成した場合を例にするなら、ユーザー一覧の表示や、ユーザー全体で共有して使うステータスを更新するメソッドを作成するときに使うと良い。

```ruby:def self.method_name での書き方
class Hoge
def self.hoge
puts "hoge"
end
end
Hoge.hoge # => hoge

# selfはHogeでもOK
```

```ruby:class << self 内でクラスメソッドを定義する書き方 class Hoge class << self def hoge puts "hoge" end end

元記事を表示

【Ruby】論理演算子(&&、||)の短絡評価を本質から理解する

# 1. はじめに

プログラムのソースコードで、しばしば以下のように`&&`で連結された処理を目にします。
```rb
user && user.authenticate(params[:session][:password])
```

この処理を読み解くと、「`user`が存在する時のみ、`user`の`authenticate`メソッドを実行する」と捉えられます。
これと同様に、`&&`と`||`は次のような使われ方をすることがあります。

```rb
条件式1 && 条件式2 #=> 条件式1がtrueの時だけ、条件式2を実行する
条件式1 || 条件式2 #=> 条件式1がfalseの時だけ、条件式2を実行する
```

では、なぜこのような挙動をするのか、原理を説明することはできるでしょうか?
「短絡評価」という名前や、コードの実行結果だけを暗記していて、原理はよくわからない、なんてことはありませんか?

実際、[Rubyの公式ドキュメントの論理演算子の項目](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator

元記事を表示

【備忘録】【Rails】new + save と create の違い

どちらもレコードをつくるときのメソッドですが、何が違うのだろうと疑問に思ったので調べました。

# new + save を使うべき場合

### ①コントローラー内で、条件分岐させたいとき

例えばArticleモデルでバリデーションの設定をしていて、
保存時にバリデーションを適用させたいときにはif文等で条件分岐の記述をしますが、
その場合は以下のようにnew + save メソッドを使います。
理由:createメソッドでは、たとえ保存に失敗してもオブジェクトを返すためif文がtrueとなり成功時の処理を行ってしまうからです。

```ruby:
def create
@article = Article.new(article_params)
if @article.save
redirect_to("該当パス")
else
flash.now[:alert] = '文字を入力してください。'
render :index
end
end
```

### ②view側で使いたいとき

例えば Book モデルを

元記事を表示

bundlerをアップグレードする

## 環境
Ubuntu20.4
Ruby2.6
gem 3.0.1

## bundlerのバージョンを確認
ローカルにインストールされてるbundlerのバージョンを確認します。下記3コマンドのどの方法でも確認できます。ちなみに、自分の環境のバージョンは1.17.2です。
```
$bundle -v
$gem info bundler
$gem list | grep bundler
```

>コマンドはbundleだが、gemの名前はbundlerです。

リモートリポジトリに上がっているbundlerの最新バージョンを確認します。下記2コマンドのどの方法でも確認できます。最新のバージョンは2.3.25でした。(2022/11/3 時点)

パイプでheadに渡しているのには理由があります。^bundlerだけでgrepすると、bundlerで始まるgemがわりと多く存在するため、たくさんのgemが一覧表示されます。headをつけることで、デフォルトで上位10件に表示を絞り込むことができます。
```
$gem info -r bundler
$gem list -r | g

元記事を表示

Bundle installでmysql2がインストールできない

### Bundle installでmysql2がインストールできない

```
$ bundle install

(省略)

An error occurred while installing mysql2(0.5.3), and Bundle cannot continue.
Make sure that `gem intall mysql2 -v '0.5.3' --source 'https://rubygems.org/'`

In Gemfile:
mysql2
```

ログに吐かれたエラー文を確認

```
directory not found for option '-L/usr/local/opt/openssl/lib'
```

lsでディレクトリの確認
```
$ ls /usr/local/opt/openssl/lib
```
ディレクトリが存在しないことがわかった。

brew install openssl で opensslのパスを確認

```
==> openssl@3:stable 3.0.7(bottled)[keg-only]
Cr

元記事を表示

バージョン指定の `~>` の別名 twiddle-wakka の由来

# `~>` の別名
Gemfile や gemspec でバージョン指定に使う `~>` には複数の別名がある。

https://qiita.com/tbpgr/items/e892fd9536d187f7c220

> - pessimistic comparison operator
> - twiddle-wakka
> - approximate
> - spermy
>
> ググってみると `pessimistic (comparison) operator` と呼んでいる人が多い。
RubyGemsのドキュメントでは `twiddle-wakka` になっている。
RubyGemsのソースコードでは `approximate` になっている。
`approximate` に変更する前は `spermy` になっていた。名前が微妙なので変えたようだ。
まぁ、たしかに見た目は・・・いや、しかし・・・。

pessimistic, approximate は意味を考えれば納得だし、 spermy はひどい名前ではあるが、見た目がたしかに似ているからわかる。

元記事を表示

Active Recordのjoinsメソッドで複数テーブルを結合する

## これは何?

[Railsガイド](https://railsguides.jp/)の[Active Record クエリインターフェイス / 13.1.3 複数の関連付けを結合する](https://railsguides.jp/active_record_querying.html#%E8%A4%87%E6%95%B0%E3%81%AE%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B)を読んでいて、`joinsメソッド`で`配列とハッシュをどのように使えばいいか深く知りたくなった`ので、いくつかのテーブル構成で実際に試し、結果をまとめた記事です。

## 対象バージョン

- ruby: `2.7.6`
- rails: `7.0.3.1`

## joinsメソッド内のルール

①複数のテーブルを結合する場合は、配列`[]`にする
②親テーブルに対して複数のテーブルを結合する場合は、配列`[]`を省略できる
③ネストして結合する場合は、ハッシュ`{}`にする

元記事を表示

privateメソッドはクラスメソッドで使えない理由から学んだことメモ

# コード例

```ruby
class Hoge

def self.xxx
yyy
end

private

def yyy
'呼んだ?'
end
end
```

```ruby
Hoge.xxx
=> NameError: undefined local variable or method `yyy' for Hoge:Class
```

# 原因
- スコープの違い
- カレントオブジェクトが異なるため、そんなメソッドないよと言われてしまう

## privateメソッドとは
「self以外のレシーバを指定して呼び出すことができないメソッド」(Ruby2.7以降)
self以外のレシーバが指定できない = **外部から呼び出しされることがない**メソッド

しかし、レシーバが指定できないだけでそれ以外はpublicメソッドと変わらない。
そのため、スーパークラスのprivateメソッドをサブクラスで使用することは可能。(レシーバの指定をしなくてもメソッドが呼び出されるから)

```ruby
class Hoge

private

元記事を表示

OTHERカテゴリの最新記事