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

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

Gemをインストールする時に関連するGemを自動でインストールする

Rubyでは標準でRubyのライブラリを管理するRubyGemsというコミュニティがあり、gemというコマンドを使用することでRubyGemで管理されているライブラリを取得できます。

RailsではGemfileというアプリケーションで使用するGemの情報を記述している管理ファイルです。
Gemfileにgemコマンドの後ろに取得したいGem名を記述し(既に取得しているGemのバージョンの変更も可)、installを実施することができますが、Gemは様々なGemが複雑に関連して動作する為、取得したいGemと関連するGemも取得する必要がある場合がある。

インストールを実施する際
“`ターミナルの作成中アプリのディレクトリ
% bundle install
“`
このコマンドを使うと取得したいGemに関連するバージョンのGemを一緒にインストールしてくれる。
これはbundlerというGemが働いてくれている。

:::note info
bundlerというGemを使うと関連するGemファイルも一緒に取得してくれる
:::

元記事を表示

RailsのAction Cableで任意のメッセージ形式でやりとりする

## 背景

REST API, WebsocketのAPIを提供するとあるサービスのMockを素早く作るため、Railsを選定したが、メッセージの形式がRailsと合わなかった。

メッセージ送信では、 `command`, `data`, `identifier`を送る必要があるが、

“`json
{
“command”: “message”,
“data”: “{\”message\”:\”test message\”,\”action\”:\”speak\”}”,
“identifier”: “{\”channel\”:\”RoomChannel\”}”
}
“`

例えば、 `command` をやめて `cmd` だけで任意のアクションを指定できるようにしたい。

## 注意

今回はローカル起動用のMockの作成を目的としていたためoverrideを試しました。
副作用の検証まではしていませんし、通常はRailに乗る方が良いので使い所は注意しましょう。

## サーバーが受け取るメッセージを任意の形

元記事を表示

【Ruby on Rails】Herokuのデプロイ時のエラーについての対処法

RailsチュートリアルでHerokuにアップする時があり、
`git push && git push heroku master`と打つとエラーになりはまってしまったのでその対処法を記述しておきます。

Herokuをデプロイするために打ったコマンド
“`
$ git commit -am “Add hello”
$ heroku create
$ git push && git push heroku master
“`

出てきた内容

“`
hogehoge toy_app % git push -f heroku main
Enumerating objects: 89, done.
Counting objects: 100% (89/89), done.
Delta compression using up to 4 threads
Compressing objects: 100% (72/72), done.
Writing objects: 100% (89/89), 22.14 KiB | 2.21 MiB/s, done.
Total 89 (delta

元記事を表示

Rails データベースの更新

データベースの更新
“`データベースの更新
rails db:migrate
“`

元記事を表示

【Ruby】毎日更新の天文写真が送信されるLINEbotを作ってみた

# はじめに
Messaging APIを使ったLINEbotでNASAの毎日更新される天文写真を送ってくれるものを作ってみました。さらに、飽き足らずに日付を選んでその日の天文写真も見られるようにしました。

#### 完成形
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549439/3093f4b0-3aab-5f20-f40c-2a941b472811.gif)

## 前提、環境など
[こちらの記事](https://qiita.com/Yuzu_Ginger/items/18edc58bd039fc19ad53)のサンプルコードが動かせることが前提です。
また、[こちらの記事](https://qiita.com/Yuzu_Ginger/items/675cca0f56a8ed8b4a23)の手順1でNASA APIキーを生成してください。

https://qiita.com/Yuzu_Ginger/items/18edc58bd03

元記事を表示

[個人開発]ランニングシューズ選びに困っている方向けのアプリ「Shoes For Runners」を開発しました

# はじめに
簡単な質問に答えることでおすすめのシューズを提案するアプリ「Shoes For Runners」を開発しました。

**サービスを作ったきっかけ**
私が陸上部に所属していたので、部活の後輩や家族からシューズの選び方についてよく聞かれました。その時に、ネットで調べても、おすすめのシューズが複数個紹介されるものの、結局どれを買えば良いのか分からないという意見をよく聞きました。そこで、簡単に自分にあったシューズがわかるアプリを作ってみようと思いました。

# サービス概要
スクリーンショット 2022-05-06 8 36 35
ランニングシューズについて何を買えば良いかわからない人におすすめのシューズを提案するアプリです。簡単な質問に答えることで自分に合ったシューズを知ることができます。

# アプリURL
ht

元記事を表示

パスワードに英数字混合のバリデーションを設定する方法

deviseにはデフォルトでバリデーションが設定されていますが、英数字混合のバリデーションはデフォルトにはないため別途記述する必要があります。
記述内容は以下二文をuserモデルに記述するだけ。
“`ruby:user.rb
VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
validates :password, format: { with: VALID_PASSWORD_REGEX }
“`

この正規表現を用いたバリデーションの記述により、パスワードに英数字混合のバリデーションを設定できました。
正規表現を用いれば英数字の他に全角かな/カナ漢字など、細かくバリデーションを設定することができます。

元記事を表示

M1MacのローカルでDockerを使ってRailsの環境を構築する。

Dockerでの環境構築につまづいたこととコントローラとルーティングでTOPページを表示させるのにつまづいたので備忘録として簡単に設定をやってきたことを記載します。

行ったことはほぼこの動画通りなので、記載内容について詳しく知りたい方はこちらを参照ください。
とてもわかりやすく解説されていました。

最初に準備したものは
デスクトップにフォルダを作成して以下のファイルを用意した。
・Dockerfile
・docker-compose.yml
・srcディレクトリの配下にGemfile

![スクリーンショット 2022-05-22 15.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654361/843fdc4b-c86b-4d0f-e254-e73cc1091177.png)

src以下のGemfile以外はこの後の操作で作成される。
![スクリーンショット 2022-05-22 15.11.5

元記事を表示

RailsアプリをHerokuにデプロイする方法

# 想定環境
Rails 5.0.7.2
(Rubyバージョンは後ほど指定する。著者は当初2.6.3を使用←herokuがサポートしていないため後ほど変更が必要)
# herokuへのデプロイ手順
## 1.herokuにアプリを作成
“`
heroku login -i
“`
でherokuにログイン(パスワードはAPIkeyでないとログインできない可能性あり)
“`
$ heroku create アプリ名
“`
## 2.本番環境用にGemfileとdatabase.ymlを変更
“`diff_ruby:Gemfile
# Bundle edge Rails instead: gem ‘rails’, github: ‘rails/rails’
gem ‘rails’, ‘~> 5.0.7’, ‘>= 5.0.7.2’
# Use sqlite3 as the database for Active Record
– gem ‘sqlite3’, ‘~> 1.3.6’
# Use Puma as the app server
gem ‘puma’, ‘~> 3.0’
#

元記事を表示

RailwayでDiscord Botをホストしてみた

[Railway](https://railway.app)というサービスでDiscord Botをホストしてみました。
![](https://storage.googleapis.com/zenn-user-upload/e9339eadd5cc-20220522.png)

# 登録
メール、またはGitHub連携で登録するようです。
Loginが登録も兼ねてるのが地味に判りづらい。
![](https://storage.googleapis.com/zenn-user-upload/669433216a8f-20220522.png)

# デプロイ
![](https://storage.googleapis.com/zenn-user-upload/1057a5c7cbad-20220522.png)
[Dashboard](https://railway.app/dashboard)に飛び、`New Project`ボタンを押します。

![](https://storage.googleapis.com/zenn-user-upload/4c9e45e9f64

元記事を表示

Ruby で素数計算プログラムを作る (無限長)

# コード

“`rb
prev_numbers = []

# 1は素数ではないので、2からカウントアップする
2.step do |current_number|
not_prime_number = false

# 今までに出てきた数全てで今の数を割る
prev_numbers.each do |prev_number|
if (current_number % prev_number).zero?
not_prime_number = true
break
end
end

# 次の数を「今までの数全て」で割るために、今までの数を覚えておく
prev_numbers.push current_number

puts current_number unless not_prime_number
end
“`

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/0b034452-ae67-

元記事を表示

連想配列とは?

JavaScriptの開発で連想配列を使ったので調べてまとめてみました!
間違っていればご指摘お願いします!
# 結論
**「連想配列とは、配列で添字(インデックス)に数字を与えているのに対して、好きな文字を与えることができる配列のことである。」**
“`sample.js
# 配列
var result_array = [
’70点’, # 値1
’60点’, # 値2
’92点’ # 値3
];

# 連想配列
var result_associative_array = {
tarou : ’70点’, # キー1 : 値1
jirou : ’60点’, # キー2 : 値2
hanako : ’92点’ # キー4 : 値3
}
“`
# Hashと同じじゃないの?
それって、RubyでいうHashのことじゃないのかなと思ったので調べたところ、厳密には違うみたいです。
## RubyにおけるHash
Rubyの[リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/class/Hash.h

元記事を表示

備忘録 whereでオブジェクトを得れなくて困っている君へ

1.~~~ids = Object.where(条件).pluck(:id)
2.Hoge = Object.find(~~~ids)

Hogeにwhereの条件で絞った、オブジェクトが複数得れる

元記事を表示

FizzBuzz

# FizzBuzz
FizzBuzzプログラムは、以下のような挙動をするプログラムです。

3で割り切れる数値を引数に渡すと、「Fizz」を返す
5で割り切れる数値を引数に渡すと、「Buzz」を返す
3と5の両方で割り切れる数値を引数に渡すと、「FizzBuzz」を返す
それ以外の数値は、その数値を文字列に変えて返す

“`
def fizz_buzz(number)

end

puts “数字を入力してください。”

input = gets.to_i

puts “結果は…”
puts fizz_buzz(input)
“`
メソッドfizz_buzzを定義して、そのなかで条件分岐する計算式を書きます。

FizzBuzzと返すには…
“`
if number%15 ==0
“`
もしくは
“`
if number%3 == 0 && number%5 == 0
“`
でも可能です。
しかし、前者のほうがシンプルなので前者を採用。コードは見やすいほうが良いので。

残りは単純です。
“`
if number%3 == 0
“`
でFizzを返し、
`

元記事を表示

Ruby での読み込み方法の整理

コード読んでいる時に、あれこれどっちだっけとなるのでメモ

# 前提
Ruby 3.0

# 内容
|メソッド |パス解決 |拡張子|再読み込み
|—|—|—|—|
|load|- 絶対パスの場合は、そのパス
– 相対パスの場合は、LOADPATH※ を順番に探す|明記 |制限なし|
|require |〃 |省略可 |初回のみ|
|autoload |〃(遅延ロード) |〃 |〃|
|require_relative|「そのファイルが置かれているディレクトリ位置」からの相対パス|〃|〃|

※ LOADPATH
`Kernel.#load` や `Kernel.#require` がファイルをロードする時に検索するディレクトリのリスト
具体的には、`$LOAD_PATH` というグローバル変数(別名は `$:`、`$-I`)

# 参考
– [Kernelモジュール](https://docs.ruby-lang.org/ja/3.0/class/Kernel.html)
– [requireとrequire_relativeとloadの違いを

元記事を表示

超かんたん!エラー箇所の特定

皆さん、コーディングは進んでいますでしょうか?

私はというと…まだプログラミング初心者のため、簡単なコードを書くのでさえ
数時間と掛かってしまいます:arrow_heading_down:

注意深くコーディングしても必ずエラーが発生してしまうんですよ!何とかならんものか…:frowning2:

エラーといっても原因は様々です、

スペルミス
メソッドの使い方が正しくない
クラスの書き方がわかんない
etc

そんな超初心者な私でも**デバッグ機能なしでエラー発生箇所を絞り込める方法**があります。
良かったら、ご覧ください。

# はじめに
本記事は以下の読者様が対象です。

* プログラミング初心者

* 理由があってデバック機能を使えない

* クラスや関数のなんとなくの流れが追える

* 一所懸命コードを追ってみるが自分の脳のワーキングメモリが足りず、次のコードを見ているときには、前のコード内容を忘れてしまい、嫌な思いをしている人

* 何時間も

ボイスチャットの開始と終了だけ通知するdiscord bot

## はじめに
やりたいこと,仕様など
– ボイスチャットの入退室を検出して通知する
– 最初の一人の入室 or 最後の一人の退室のみ通知する(LINE風の通知)
– 通知を送信するテキストチャンネルを設定可能
– 入退室を通知しないボイスチャンネルを設定可能
– スラッシュコマンド対応は考えない
– discordrb(Ruby)を使用

一人ひとりの入室,退室を全部報告するのではなく,
LINE風に開始と終了の通知だけにしたかった。

## コード
notice.rbと同じディレクトリに「svrconf」ディレクトリを作成し
サーバごとの設定(=通知を流すテキストチャンネルのID)を保存する

~~~notice.rb
# coding: utf-8
require ‘discordrb’
require ‘logger’

# トークンとID
bot = Discordrb::Commands::CommandBot.new token: トークン, client_id: クライアントID, prefix: ‘/’
# 外部ファイル(サーバ毎設定)
svr_conf=”

【Rails】find_or_create_byでバリデーションをskipさせたい

# 結論
## 1.saveに `validate: false`を渡す
– `validate: false`を末尾に記載することで、バリデーションをskipできました。
– 加えて、無意味な`save`を2回走らせないように、`find_or_create_by` から `find_or_initialize_by` に修正しました。

“`ruby
Model.find_or_initialize_by(name: “テスト”) do |m|
m.published_at = Time.zone.today – 1 # バリデーション対象のコード
m.save(validate: false) #=> バリデーションをskipさせる
end
“`

# 補足
@jnchitoさんよりコメントいただきました。

## 1.new_record?メソッドを使用する
ブロックの外で`save(validate: false)`を実行します。

“`rb
# この時点ではsaveしない
model = Model.find_or_initialize_by(name: “

Ruby メソッド色々

# getsメソッド
キーボード入力された値を取得するメソッドです
“`
puts “キーボードから何か入力してみましょう”
get_key = gets
puts “入力された内容は#{get_key}”
“`
“`
キーボードから何か入力してみましょう
“`
入力待ちの状態になります。
ここに
“`
キーボードから何か入力してみましょう
hello
入力された内容はhello
“`
helloと入力する打ち込んだ内容が表示されます。
変数展開をすることで何を打ち込まれもいいようにしておくことも大事

# while
繰り返し処理を行いたいときに使います。指定した条件式が真(true)の間、繰り返し実行されます。while doの文法で記述を行います。
“`
dice = 0 変数diceに0を代入、初期値を設定

while dice != 6 do サイコロの目が6ではない間、diceの初期値は0なので条件を満たす。以降はdiceに代入される数によって結果が異なる
dice = rand(1..6) 1~6の数字がランダムに出力される
puts dic

Ruby 変数と定数

# 変数
変数は、文字列などのオブジェクトを作成したときに、そのオブジェクトにつける名札です。
変数名は小文字で始まるルールがあります。また、数字を使うことはできません。

“`
program = “プログラミング学習”
puts program
“`
programに文字列”プログラミング学習”を代入した時、programをputsすると
“`
プログラミング学習
“`
という結果が表示されます。
この場合の「=」は、数学での等しいという意味ではなく、「右のオブジェクトを左の変数に代入する」という意味です。

変数の特徴として、変数は値を書き換えることができます。
“`
program = “プログラミング学習”
puts program

program = “プログラマー”
puts program
“`
としたとき、
“`
プログラミング学習
プログラマー
“`
という結果が表示されます。
4行目で変数programに再度値を代入したため、5行目の結果はそれに代わっています。

# 定数
先ほどの変数とは異なり、あらかじめ変更しないことが保証された数値やデータ