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

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

未経験の新人でも1ヶ月で「使える」人材に育てる仮想プロジェクト型研修(後編)

## これまでのあらすじ

当社では開発未経験の新人さんが入ってくると、
研修の一環として仮想の開発プロジェクトを立ち上げて、
仕様決めからリリースまでの一連の開発作業を体験してもらっています。

計画する、コードを書く、ツールを使う、わからない事を調べる、周りに聞く、トラブルシューティングする、
といった開発における一連の流れを経験してもらいます。

ただ単に知識として理解するというよりも、
経験することでより深く理解してもらえると考えています。

前編では、仮想プロジェクトの入る前の準備や、プロジェクト始動時に、
新人達・先輩達がそれぞれどういったことを行うかを説明しました。

[前編はこちら](https://qiita.com/tatsumi_t2/items/7c5ceca6f354ba21c2eb)

## 後編では

仮想プロジェクトを日々どんな風に進めるのか、リリースまでの話しをしたいと思います。

# 日々の開発作業

## コーディング

新人さんたちの思うように自由に書いてもらいます。
質問されたり、コードを見せてもらった時に、良い書き方を教えることはありますが

元記事を表示

rails + postgresql + dockerでのコンテナ作成

初投稿のため、問題点、改善点などありましたら
是非ご連絡いただけると幸いです!

# 各ファイルコード
“`Dockerfile:Dockerfile
FROM ruby:3.0.1

# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – && \
echo “deb https://dl.yarnpkg.com/debian/ stable main” | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn

RUN apt-get install -y nodejs npm && npm install n -g && n 14.19.1
RUN mkdir /app_name
WORKDI

元記事を表示

【Ruby】Minitestでスタブを使う(stub/stub_any_instance)

# はじめに

スタブ(stub)とは、テスト中で呼ばれるメソッド処理の代用品のようなものです。
テストで呼ばれるメソッドの処理を指定した処理で置き換えることができます。
「外部サービスの呼び出し処理などを置き換えることによって仮状態で動かして、本当にテストしたい部分へ簡易的に辿りつきたい」といったときによくスタブを使います。

以下では例として次のような`SampleService`のテストを作成することを考えます。

“`ruby
class SampleService
def initialize; end

def call
is_error1 = call_api1
is_error2 = CallApi2Service.new.call
return ‘error!’ if is_error1 || is_error2

‘success!’
end

private

def call_api1
# 外部API1の呼び出し処理
end
end
“`
“`ruby
class CallApi2Servic

元記事を表示

【Ruby】文字列を部分的に抽出・削除するメソッドまとめ

# String#[]

文字列の範囲を指定して部分文字列を取り出す。

“`ruby
str = ‘sample_string’
str[0] #=> “s”
str[1, 3] #=> “amp”
str[2..5] #=> “mple”
“`

**String#slice**も同様。

“`ruby
str = ‘sample_string’
str.slice(0) #=> “s”
str.slice(1, 3) #=> “amp”
str.slice(2..5) #=> “mple”
“`

正規表現による指定もできる。

“`ruby
str = ‘sample_string’
str[/a.+l/] #=> “ampl”
str.slice(/a.+l/) #=> “ampl”
“`

# String#match

指定した正規表現にマッチした部分を取得する。
**正規表現マッチを扱うクラス(MatchData)のインスタンスが返却される。**
第二引数によりマッチの開始位置を制御できる。

“`ruby
str = ‘sample_string’
st

元記事を表示

Rails 5.2系から6系へアップデートする際の落とし穴

## 内容
Rails 5.2系から6系へアップデートをした際に、`ActionView::Template::Error invalid base64` エラーが発生してしまう

## 結論
CSRFトークンのフォーマットの違いが原因で発生するエラー

Rails 5.2.5ではCSRFトークンのフォーマットにbase64_urlsafeを利用しているのですが、Rails 6.0系ではbase64_strictを利用している、この違いによってArgumentErrorが起きるようです

## 原因
Rails6.0系のアップデートで、フォーマット方式を変更できるオプションを用意しないまま、フォーマット方式が強制的に変わってしまった
それにより、base64_urlsafeをデコードできずに、エラーが発生してしまう

“`
rails: 5.2.5 -> 6.0.x
CSRF Token format: base64_urlsafe → base64_strict
“`

https://github.com/rails/rails/issues/41783

## 解決法

元記事を表示

Rubyで半角小文字カナを半角カナに変換

## はじめに
半角小文字カナから半角カナへ変換する必要があったので対応をメモとして残します

半角カナ→全角カナへの変換は色々と情報があったが、半角小文字カナ→半角カナへの変換はあまり情報がなかったので、同じような実装をする方の参考になればと思います

## 実装方法
gsub!メソッドのパターンマッチを使って変換機能を実装

https://docs.ruby-lang.org/ja/latest/method/String/i/gsub=21.html
> gsub!メソッドは、文字列中の pattern にマッチした部分をキーにしてhashを引いた値で置き換えすることができる

上記のhashを用いての変換を使用

## 実装例
“`rb
PATTERN = { “ァ” => “ア”, “ィ” => “イ”, “ゥ” => “ウ”, “ェ” => “エ”, “ォ” => “オ”, “ッ” => “ツ”, “ャ” => “ヤ”, “ュ” => “ユ”,
“ョ” => “ヨ”, “ー” => “-” }.freeze

## 半角小文字カナを設定
str = “ァィゥェォ”

元記事を表示

TracePointの不可能を可能にする裏技

# TracePointの弱点

Ruby組み込みのクラス`TracePoint`は非常に便利ですが、
**Cで定義されたメソッドはフックできない**という弱点があります。

“`rb
target = ::Class.instance_method(:attr_accessor)

TracePoint.new(:call) do |tp|
p tp
end.enable(target: target) do
class Foo
attr_accessor :foo
end
class Bar
attr_accessor :bar
end
end
#=> :212:in `enable’: specified target is not supported (ArgumentError)
“`

これは[ドキュメント](https://docs.ruby-lang.org/en/3.1/TracePoint.html#method-i-enable)にも記載があります。

> `target` sho

元記事を表示

statusがupのmigrationファイルはmigrateされない

railsでmodelを作成してmigrateして、、、を盲目的におこなっていたのでmigrationファイルのstatusについてまとめます。

# migration statusについて
“`$ rails db:migrate:status“`で確認することができます。
statusがupのものはmigration済でmigrateされません。逆にdownのものがmigrateされてschema.rbに反映されます。
schemaに反映されたものは以下の三箇所で使われる。

– ActiveRecord::Railtieのinitializer
– ActiveRecord::Tasks::DatabaseTasks
– active_record/railties/databases.rake

# 本番環境で躓いた
私自身、ローカルで盲目的にrails db:migrateしており、本番環境でtableが作成されないことがありました。
ここら辺は学ばないと確実に躓きそうなポイントだと思ったので記事にしました。

元記事を表示

[Rails]path指定してJSONを取得する方法

railsで開発をしていたときに
ローカルでは正しくJSONファイルを読み込めているが、本番環境でRoutingエラーになる事案が発生しました。

# やりたかったこと
ページの最初の挙動としてロゴをアニメーションで表示することでした。
“`
var title_animation = {
wrapper: title_dom,
animType: ‘svg’,
prerender: true,
loop: true,
autoplay: true,
path: ‘/logo_animation’
};
“`
jsファイル内でイベントの設定を記述。
ロゴアニメーションをJSONファイルに変換したものをpathで読み込んでいました。

# エラー内容
開発環境では正しく動いていたものの、GCP cloud runにデプロイした途端に問題発生。
devツールで確認したところ、JSONの取得が404エラーになっており、実際にURLを入力したところRoutingエラーでした。

![スクリーンショット 2022-06-30 11.00.23.png](https:

元記事を表示

Railsのpluckメソッドって便利だなーの話

#### はじめに
実務でcontrollerからviewへ値を渡すときに悩んでいたら先輩からpluckメソッドを使うといいよと言われました。
プログラミングスクール時代には学習しておらす、実際に使ってみて「あっ便利だ!」と思いましたので備忘録として残したいと思います。
なお、学習のためにcontrollerからviewへ値を渡す際にかなりまわりくどい書き方をしていますのでご了承ください。
おかしな点等は教えていただけるとありがたいです。

#### 環境
Ruby 2.6.5
Rails 6.0.5

#### pluckとは
pluckとは英語で「摘みとる」という意味らしいです。なんか残酷な・・・。
おそらくオブジェクトから値を摘み取っていくということなんでしょうね。
そんなことは置いといて調べてみると

>pluckメソッドとは、引数に指定したカラムの値を配列で返してくれるメソッドです。
>上記の様にmapメソッドに置き換える事が可能ですが、返り値を配列として取得する場合は、pluckメソッドを使った方がシンプルに記述することが出来ます。

と書かれています。うん、うんそういう

元記事を表示

?【メモ】Railsの基礎中の基礎の用語集②

# はじめに
前回に引き続き、今回も基礎的な用語のアウトプットを行います。

# 運用環境
運用環境とはシステムをどこで使用するか定められている環境のこと。3つの種類がある。
| 運用環境 | 通称 | 概要 |
|:-|:-|:-|
| development | 開発環境 | 主にアプリケーションを開発する際に使用する環境 |
| test | テスト環境 | アプリケーションの動作をテストする際に使用する環境 |
| production | 本番環境 | アプリケーションを実際にリリースする際に使用する環境 |

なぜこのように環境を分けるのかというと、環境ごとに必要な設定が多く存在するためである。
例えば、開発環境では「バグを探しやすいツール」を導入したほうが便利だが、本番環境ではアプリケーションのパフォーマンスを上げるために、余分なツールは使わないほうが適切である場合などがあるため。
Railsでは`database.yml`を編集することで、データベースの設定を運用環境ごとに変更できる。

# ライブラリ
他のプログラムと合わせて使用するために、複雑なプ

元記事を表示

Javaで実装されていたシステムをRubyに移行した話

https://tech.speee.jp/entry/java-to-ruby

元記事を表示

クラスメソッドとインスタンスメソッド

# クラスメソッドとインスタンスメソッドについての気づきたち
## クラスメソッドの定義方法
“`rb
class User
def self.greeting
puts “クラスメソッドへようこそ”
end
end
“`
– **メソッドの前に`self.`を指定**
## インスタンスメソッド
“`rb
class User
def greeting
puts “インスタンスメソッドへようこそ”
end
end
“`
## 使い分け
:::note info
クラスメソッド:クラス全体に関係する処理で使用する
:::
:::note warn
インスタンスメソッド:インスタンスに対して個別的に適用したい処理で使用する
:::

## ⚠️
クラスメソッド・インスタンスメソッドに関する知識は、ここに蓄積していくため、編集・追記が多くなると思いますが、ご容赦ください・・・・

元記事を表示

Rails APIのSerializerで、任意のキーを指定する方法

実務にあたっている中で、気になったので、備忘録的に示しておく。
思いつきで、つらつらと書いた。

### 大きくわけて3つある

### 1 key で指定する
“`ruby
class PostSerializer < ActiveModel::Serializer attributes :id, :title attribute :body, key: :post_body end ``` ### 2 メソッド ```ruby class PostSerializer < ActiveModel::Serializer attributes :id, :title   def post_body   object.body end end ``` ### 3 ブロック ```ruby class PostSerializer < ActiveModel::Serializer attributes :id, :title   attribute :post_body do object.body end end ``` ### cf

元記事を表示

Railsでデータをランダムに1つだけ取り出す方法

## はじめに
プログラミング初学者の自分用アウトプットです。
誤った知識や記述があれば教えていただけると幸いです。

## 開発環境
– ruby2.6.3
– rails6.1.4

## やりたいこと
データベースに投入したデータからランダムにデータを1つだけ取り出して表示したい。

## 試したこと

① RANDOM()を使用
“`posts_controller.rb
@post = Post.order(“RANDOM()”).first
“`
しかし上記では本番環境(MySQL)では動かない。
本番環境用にRANDOM()➡︎RAND()へ変更すると今度はローカル環境で動かない…

② shuffleを使用
“`posts_controller.rb
@post = Post.all.shuffle.first
“`
上記の記述でうまくいきました!

元記事を表示

[Refactoring]多くなったPrivateメソッドはクラス化できる!!

どうも、「病院なび」の開発チームメンバー甘利です。
今日はリファクタリングについて書こうと思います。

うちのホープの@KON-ch(こん)が勉強会に参加して「多くなったPrivateメソッドはクラス化できる!!」というのをもたらしてくれました。
確かにそうだわ、、と納得したので早速使っていきたいと思います。

# そもそもなぜPrivateメソッド達をクラスにする必要があるのか
単体テストの範囲を細かくできます

# Privateメソッドがたくさんある実装
以前書いた [自社サービス「病院なび」へ AWS Opensearch を導入したい](https://qiita.com/namarin/items/533e4297f05d23f198b3)を実装した際のクラスをリファクタリングしたいと思います。この`IndexingService`というクラスは社内での運用に合わせて Opensearch のインデックスを簡単に管理する目的で実装しています。簡単に管理する一環としてIndexを作成する際に、指定されたインデックス名に日付を表すサフィックスを付与し`index_name_20

元記事を表示

[paiza][ruby] マップの判定・縦横 (paizaランク B 相当)を整理する

### はじめに
paizaでアルゴリズムを学習し始めて日が浅いです
ランクBになると途端にコードが長くなり混乱中です
Aランクアップメニュー > マップの判定・縦横 (paizaランク B 相当)の回答に対して理解を深めたいと考え記事にしています
⚠シェア可能な問題集の問題です
⚠リファクタリングとかはせず愚直に与えられた回答を使用しています

また、問題をご存知な方前提になっていますので入力例・出力例は載せていません

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss

### 回答

“`ruby
h, w = gets.split.map(&:to_i)
board = h.times.map { gets.split(”) }

board.each.with_index do |row, y|
row.each_index do |x|
flag_row = false
flag_clm = false

if x == 0

元記事を表示

【Rails】Rubocopのアップデートとrubocop-rails_configの導入

## はじめに
未経験からエンジニアに転職して、3ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。

今回はRubocopのアップデートで学んだことを残しておこうと思い、記事を書きます。

## rubocop-rails_config の導入
https://github.com/toshimaru/rubocop-rails_config

こちらがrubocop-rails_configというgemです。

> 「何かしらRuboCop設定のレールが欲しいよね〜」というところで閃き、「だったらrailsチームの用意した公式rubocop.ymlを使えばいいじゃない」ということで冒頭のRailsとほぼ同じ設定を持ったrubocop-rails gemを作りました。(https://blog.toshimaru.net/rubocop-rails/)

このgemを使用することで↓の設定とほぼ同じrubocop.ymlファイルが作れるというものです!

https://github.com/rails/rails/blob/main/.rub

元記事を表示

Ruby で「カラオケマシン問題」を解いてみた

Rubの学習を初めて3週間あまりのプログラミング初心者です。
[「カラオケマシン問題」](https://blog.jnito.com/entry/2014/06/06/104420)にチャレンジしてみました。

“`ruby
class KaraokeMachine

@@scale = %w[C C# D D# E F F# G G# A A# B] #

def initialize(melody)
@melody = melody
end

def transpose(key)
result = Array.new
# melody に渡された文字列を(\w#?) で区切り配列とすることで#に対応
str_array = @melody.split(/(\w#?)/)
str_array.each do |str|
# scaleの要素とindex番号を変数に入れる
@@scale.each.with_index do |value, index|

元記事を表示

[ruby] each_with_index, each.index_with, each_indexの違い

### はじめに
paizaで出てきたメソッドの違いをまとめました

[参考にさせていただきました!](https://udemy.benesse.co.jp/development/system/ruby-each-with-index.html)

### 結論
“`ruby
.each_with_index
通常のeach + 0からカウントするindexを得る
.each.with_index
動きは上と同じ
.each_index
要素分+1 indexを得る
“`

#### each_with_indexとeach.with_indexの違い
`each_with_index`はindexが0からスタートする
`each.with_index(1)`と引数を渡すと(0ではなく)1番目から始められるため`i+1`とやる必要がなくなる

### 使い方
“`ruby
array = [“a”, “b”]

array.each_with_index do |a, i|
puts “「#{i} #{a}」”
end
#=> 結果
# 「0 a」
#

元記事を表示

OTHERカテゴリの最新記事