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

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

Slack::Notifierをrspecでmockする

SlackNotifierのmock方法の記事が見つからなったため書いてみました。

“`rb
let(:slack_mock) { double(‘slack’) }

subject { #処理を定義 }

# pingレシーバーを定義
before(:each) do
allow(Slack::Notifier).to receive(:new).and_return(slack_mock)
allow(slack_mock).to receive(:ping)
end

it ‘Slack通知が実行されない’ do
expect(slack_mock).to receive(:ping).never
subject
end

it ‘Slack通知が1回呼び出される’ do
expect(slack_mock).to receive(:ping).once
subject
end

# メッセージまで検証したい場合は下記の通り

it ‘Slack通知に想定メッセージが渡され実行される’ do
expect_message = “test”

元記事を表示

[Rails7]kaminariでページネーションするときにundefined method `page’ for #

https://qiita.com/mmaumtjgj/items/771deb2f3da3eecb4f54

こちらの記事を参考にpagenate機能を実装しようとしていたところ、undefined method `page’ for #

元記事を表示

[Rails]実務のコードは膨大すぎて大変だった。全体のコードの把握するためのコツとは。

## 実務のコードは膨大すぎて大変だった!
Railsで下記のサービスを作ったことはありますが、やはり、実務としてのコードは膨大すぎて、初めて実務に入った時は大変な思いをしました。

https://qiita.com/parkon_hhs/items/98304bc5112f0e0f6faf

私だけがわからなかったことかもしれませんが、膨大なコードを把握するために知っておくといい項目をいくつかまとめてみようかと思います。

## 環境
– Rails
– VSCode
– macOS

## Railsのコードの動きの把握
最初にRailsのコードの把握するコツを紹介します。
#### どこにも定義されてないメソッドについて
例えば`post_controller.rb`に定義されてないのに使われているメソッドがありますね。
それは主に`modelで定義されたメソッド`か`gem専用のメソッド`の可能性が高いです。

まずは`post_controller.rb`なので、`model/post.rb`を調べてみましょう。モデルメソッドがコントローラーで使われているかもしれません

元記事を表示

[Ruby&VSCode]のメソッドジャンプの設定方法

## はじめに
Javascript&VSCodeでのお馴染みの`Go to definition`(`F12`キー)機能ですが、Rubyではデフォルトではない機能ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350392/372a17e4-a88a-f7cd-6cbf-87d9815ddf15.png)

初めて実務でRailsのコードを読んだ時、メソッドを一つ一つ検索するのが面倒で、調べたら設定方法がありました。
現在はうまく活用できて作業効率アップにつながった機能ですね。

それでは、ご紹介したいと思います。

## 設定方法

1. VSCodeの拡張機能(Extensions)アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350392/8d1dcf41-dbe2-6dee-6fd5-d3539e509940.png)
2. `Ruby by Pe

元記事を表示

Mysql2::Error: Table ‘users’ already exists schema.rb

# エラー内容
ユーザー管理機能を実装していた時のこと。
テーブルを作成後に、`rails db:migrate`実行時に
`Mysql2::Error: Table ‘users’ already exists`とエラー表示される。

# 仮説1
調べたところ↓
https://qiita.com/TAKE1219/items/fbc9578226771427fcdd

usersテーブルは既に存在しているよ!とエラーが出ている様子。
また、原因としてdatabase.ymlの
`encoding: utf8mb4`を `encoding: utf8`へ修正する必要がある。

修正して再度
~~~
rails db:migrate
~~~

~~~
Mysql2::Error: Table ‘users’ already exists
~~~
の表示・・・

`rails db:migrate:status`でmigrationファイルの確認。
~~~
Status Migration ID Migration Name
———————–

元記事を表示

Ruby クラスとインスタンス2

ターミナルで以下のように出力させるために、コーディングしていきます。

“`
# ターミナル
著者: 太郎
タイトル: プログラミングについて
本文: プログラミングを学ぼう!
“`

“`ruby
class Article

def initialize(author, title, content)
@author = author
@title = title
@content = content
end

def author
@author
end

def title
@title
end

def content
@content
end
end
article = Article.new(“太郎”, “プログラミングについて”, “プログラミングを学ぼう!”)

puts “著者: #{article.author}”
puts “タイトル: #{article.title}”
puts “本文: #{article.content}”
“`
***Article.new*

元記事を表示

webエンジニアを目指して

現在、SES(客先常駐)企業でフロントエンドエンジニアをしているbachikoriです。

今日からwebエンジニアへの就職を目指して頑張ったことや気づいたことを投稿できたらと思います。
初めの投稿となりますので自己紹介や現在のスキル、転職しようと思ったきっかけなどを綴りたいと思います。

# 自己紹介
現在、22新卒でSESの企業に所属しています。
大学は文系科目で情報系の学部に入りましたが、当時はプログラミングにあまり興味が持てませんでした。大学3年生後半に友達と受けたプログラミングの授業をきっかけにJavaScriptを勉強しはじめ、大阪から上京してきました。

# 現在のスキル
– HTML/CSS
– JavaScript
– React(useState, useEffect, react-router-domが使える程度)
– ruby on rails(progateの課題を全て完了した程度)

これからこちらの[gitihub](https://github.com/bachikori)に新しく学んだことを共有していきます。

# 転職しようと思ったきっかけ
現在行っ

元記事を表示

【Rails】診断機能を実装(徹底解説)

今回は診断機能を実装していこうと思います
[こちらの記事](https://x.gd/bFoP4)を応用したものになりますので、必要があればご参照ください。

# 目次
① 診断機能の実装イメージ
② 実装の下準備(診断内容の考察)
③ モデル・テーブルの作成
④ 診断するページを作成する
⑤ コントローラーを記述する
⑥ 診断結果を表示するページを作成する
おまけ① 診断結果を保存したい場合

※すぐに実装を始めたたいという人は、①・②をとばし、「③ モデル・テーブルの作成」から始めてください

###### 実装環境
ruby 3.0.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]
Rails 6.1.5

## ① 診断機能の実装イメージ

診断機能とはどういうものか、イメージを明確にしておきます

① 以下のサイトで実際に診断機能を動かしてみましょう

② 診断機能のプログラムの構造を図解します

まずは以下の写真を見てください
![image.png](https://qiita-image-store.s3

元記事を表示

Ruby クラスとインスタンス

# クラスとインスタンス

## クラスは個別の値(データ)を作るための雛形。
値の元となるもの。値の共通のルールを定義します。
よく設計図に例えられます。(ひな形、〇〇の設計図など。)

クラスの定義
“`ruby
class クラス名

end
“`
※クラスは大文字から始めます。

## インスタンスはクラスをもとにして作られる「データ」のことです。
クラスから作られた個別の値(データ)のこと。
クラスが定義した共通の属性やメソッドをインスタンスは持ちます。
実態を持ちます。

クラス(設計図)を元に、インスタンス(実態)を作るということ。
クラスは設計図なので、実際に何か行うには、クラスから実態であるインスタンスを作る必要です。

インスタンスは、クラスが使用できる***newメソッド***を実行し、生成します。

## newメソッド
newメソッドは、使用したクラスのインスタンスを生成して返す役割があります。
以下のようにして、インスタンスを生成し変数で扱います。
“`ruby
変数名 = クラス名.new
“`

“`ruby
class Ta

元記事を表示

Ruby 配列

# 配列とは
1つの変数で複数の値を持つことができる値。
配列の中には、複数の値を入れることができ、順番で値を管理します。

### 配列の宣言
“`
変数 = []
“`

“`ruby
fruits = [“りんご”, “みかん”, “いちご”]
puts fruits
“`
“`
# ターミナル出力
りんご
みかん
いちご
“`

fruitsという変数に、バナナという要素を追加してみます。

“`ruby
fruits = [“りんご”, “みかん”, “いちご”]
fruits << "バナナ" puts fruits ``` ``` # ターミナル出力 りんご みかん いちご バナナ ``` このように、配列演算子<<を使って配列に要素を追加することができます。

元記事を表示

Rubyで本気で考えるnil safe

※ 本記事の内容は[作者のブログ](https://www.fumi-blog.link/articles/hz3ekqyxyyiv)にも書いているのでこちらも応援お願いします?‍♂️

## はじめに
以下のようなclassを考えます

“` ruby
class Person
attr_accessor :first_name, :last_name
def full_name
last_name + first_name
end
end
“`

このクラスは、苗字と名前を与えると、full_name関数でそれを合わせた形で取り出すことができます

“` ruby
person = Person.new
person.last_name = ‘山田’
person.first_name = ‘太郎’
puts person.full_name # 山田太郎
“`

では、以下の場合はどうでしょうか

“` ruby
person = Person.new
puts person.full_name
“`

実行すると以下のようなエラーが

元記事を表示

RubyからChatGPTのAPIを叩く

## はじめに

RubyからChatGPTのAPIをたたく記事を探したが、意外となかったので忘れるまえに書いておく。
(正確には、OpenAI API)

## 利用するライブラリ

https://github.com/alexrudall/ruby-openai

これを使う。

“`sh
gem install “ruby-openai”
“`

ChatGPTの API Key を取得しておく。

あとは次のようにすれば、利用することができる。(自分の場合は、以前に登録したときの無料枠が失効しており、クレジットカードを登録する必要があった。)

“`ruby
require “ruby/openai”

client = OpenAI::Client.new(access_token: “ACCESS_TOKEN_GOES_HERE”)

res = client.completions(
parameters: {
model: “text-davinci-003”,
prompt: “Are you a

元記事を表示

Ruby3

問題

国語が80点、英語が50点、数学が70点の場合のテストの平均点をターミナルに出力するプログラムを記述してください。

条件1:このプログラムでは各教科の点数を変数を使って定義してください。
条件2:出力結果は以下のようになるようにコードを書きましょう。

“`Ruby:ターミナル
3教科の平均点は、◯点です。
“`

※◯の箇所には計算した平均点が入ります。

出力にはputsを使います。putsのあとに半角スペースと出力したい文字列を続けることで、文字をターミナルに出力できます。

“`Ruby:記述方法
puts “出力したい文字列”
“`

“`Ruby:解答
japanese_score = 80
english_score = 50
math_score = 70

average_score = (japanese_score + english_score + math_score) / 3

puts “3教科の平均点は、#{average_score}点です。”
“`

【解説】
「変数を使って」と指定があるため、

元記事を表示

Ruby getsメソッド

# getsメソッド
ターミナルに値の入力機能を起動するメソッドのことを言います。
文字列としてプログラムに渡されます。


“`ruby
name = gets
puts “私の名前は#{name}です”
“`
このように記述すると、ターミナルではまず、入力機能が実行されます。
入力待ちの状態。(name = getsの部分)
入力してEnterすると、”私の名前は#{name}です”の部分が表示されます。
以下のようになります。
“`
ポチ
私の名前はポチ
です
“`
と出力されます。
“です”の部分が改行されています。
このように文字列オブジェクトの後ろには、改行が入ります。
この改行を取り除くときには以下のように書きます。
“`ruby
name = gets.chomp
puts “私の名前は#{name}です”
“`

ターミナルでは以下のように出力されます。
“`
ポチ
私の名前はポチです
“`
***chomp(チョンプ)メソッド***と言います。
このメソッドを使用すると、文字列の末尾に存在している改行を取り除いて文字列を返します。

元記事を表示

jquery.jpostal.jsで自動入力が反映されない

# はじめに

jquery.jpostal.jsで自動入力された先がselect2だった場合、値が反映されなかった
(selectタグだと正常に自動入力された)

# 解決方法
triggerオプションを追加することで自動入力された値の変更を検知できるようになる

“`
trigger : {
‘#address1_kana’ : true,
‘#address2_kana’ : true,
‘#address3_kana’ : false
}
“`

# 参考文献
[「jquery.jpostal.js」で自動入力された値に反応して特定要素のテキスト変更とクラスの付与をしたい](https://teratail.com/questions/215786)

元記事を表示

Procodile の process に HUP/USR1 等のシグナルを送信してもログファイルは reopen しません

## はじめに

Ruby には [Foreman] や [God] 等 process を管理してくれるツールがあり [Procodile] もその1つです。
今回 [Procodile] が出力する ログファイル が logrotate 時 reopen されていなかったため動きについて調査したので簡単にまとめました。

https://github.com/adamcooke/procodile

https://github.com/ddollar/foreman

https://github.com/mojombo/god

## 先に結論

[Procodile] が開いた logfile を reopen する方法は現時点存在しません。
[Procodile] (supervisor を含め) そのものを `stop`, `start` する必要があります。

“`sh
$ bundle exec procodile stop –procfile path/to/Procfile –stop-supervisor
Stopped xxxxxx.1 (PID: xx

元記事を表示

Ruby 変数を利用して値に名前をつけて使う

# 変数とは
変数とは、値を入れる箱のようなものです。
その箱に名前を付けたものが、変数名と言います。

変数を利用することで、値を再利用したいときに、変数名を使うだけで呼び出すことができます。

# 変数名の定義
“`
fruit = “りんご”
puts fruit
=> “りんご”
“`
定義は上記のようにします。” = “を挟んで、右辺に置いた値を、左辺の変数(今回はfruitという箱)の中に入れるイメージ。

***変数名 = 格納する値*** 

この” = “は、「等しい」という意味ではなく、「変数の箱の中に値を入れる」という意味です。
***代入演算子***と言います。


変数を使って、以下の条件に沿ってプログラムを作成します。

条件:
国語が80点、英語が50点、数学が70点の場合のテストの平均点をターミナルに出力させる。
ターミナルに、「3教科の平均点は、◯点です。」と出力されるようにコードを書く。

“`ruby
# 模範解答
japanese_score = 80
english_score = 50
math_score = 70
avera

元記事を表示

【初学者向け】DockerでRails7の環境構築(2023年版)

[Dockerの公式ドキュメント](https://docs.docker.jp/compose/rails.html)でRails7系の環境構築をしたら途中で詰まったので、スムーズに構築していく方法を記します✏️

## 前提条件
開発環境
– M1Mac: Ventura13.0
– [Docker Desktop](https://docs.docker.com/desktop/install/mac-install/)インストール済み

## この記事でわかること

✅[Dockerの公式ドキュメント](https://docs.docker.jp/compose/rails.html)に沿ったRails7系の環境構築方法✅
(公式ドキュメント通りに行うとエラーが発生するので、本記事ではその解決方法も記します!)
※ 本記事では、DockerでRails7を最速で環境構築する方法を記します。DockerやRailsの詳しい説明については別記事をご参照ください?

## 環境構築手順

### 1. 任意のディレクトリを作成
Macの任意

元記事を表示

うまく使えばレスポンスが爆速に Rails 7から導入されたload_asyncについて解説

今回はRails 7から導入された新機能 load_asyncについて解説します!

[私のブログ](https://ftb3nip05e.microcms.io/apis/blogs/dnjqj82-63)にも同じ内容を記載しておりますので、こちらも是非ご参照ください

## load_asyncとは
Rails 7から追加された、「非同期的にクエリ実行するためのメソッド」です。

並列にクエリが実行されるため、うまく使うと **これまで時間がかかっていた処理をかなり短縮できる「可能性」** があります。

## load_asyncの使い方
以下のような場面を想像してみましょう。

mypageを取得するメソッドの中で、「お客様のプロフィール」「お客様の購入履歴」「お客様の獲得ポイント」の3つを取得しています。

“` ruby
def mypage
@profile = Profile.find_by(user_id: params[:user_id])
@orders = Order.where(user_id: params[:user_id])
@poin

元記事を表示

Stripe Connectの連携アカウントのSubscriptionの更新方法(Ruby)

連携したアカウントのサブスクリプションの内容を変更する方法が分からずに少し苦労したので、変更方法についてメモを残します。

“`code .rb
Stripe::Subscription.update(
“subscription_id”, # sub_××××××××××××
{
# 変更したい内容を記述
application_fee_percent: “20”, # サブスクリプションの手数料を20%に変更
},
{ stripe_account: ‘連携アカウントのID’ } # acct_××××××××××××
)
“`

元記事を表示

OTHERカテゴリの最新記事