Ruby関連のことを調べてみた2021年03月17日

Ruby関連のことを調べてみた2021年03月17日
目次

複数のcollection_selectで選択したIDを配列形式で送信する

##what
複数のcollection_selectで選択したIDを配列形式で送信する方法

##why
collection_select を利用した選択項目を複数設置する場面に置いて、パラメーターに配列形式で格納するという手段を取りたいが、どこを探しても見つからないため、いろいろさ試行錯誤していたら発見したので忘備録として投稿します。

##方法
まずcollection_selectの基本から

“`
<%= f.collection_select(:item_id, Item.all, :id, :name, {}, {class:"item-select"}) %>
“`
引数の説明

第一引数
:item_id 保存先のカラム名

第二引数
Item.all データの入っているモデルを指定

第三引数
id 表示する際に参照するDBのカラム名

第四引数
name 実際に表示されるカラム名

第五引数
(オプション) {} {}はオプションの指定なし

htmlオプション {class:”genre-select”}

【Project Euler】 Problem2 【解いてみた】

# はじめに
【Project Euler】とは、プログラミングで解く数学の問題集です。

本投稿では初学者なりに、Problem3 を解くにあたっての考え方を解説しています。
ちなみに言語はRubyを用いています。

※本投稿は、Project Eulerのガイドラインに従い、解答例としてのコードは載せておりません。
 また、問題に関しては私が翻訳しています。ミスがあればご指摘ください。
  
【Project Euler】について知りたい方はこちらから↓

https://projecteuler.net/

# 問題(original ver.)
The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

# 問題(翻訳ver.)
13195の素因数は5,7,13,29である。
600851475143の素因数で最大のものを求めよ。

## 問題を解く上でのヒント
①まず600851475143の素因数を求めること

after_commitでDBの保存前後を比較判定する

# 何を書いているか?
DBの保存前と保存後の判定の仕方に1日詰まってしまい、せっかくなので備忘録として書いてます。

# どういう状況で詰まったか
after_commitスコープ内で、DBの保存前と保存後で比較し、保存・更新・削除されていれば、trueを返す処理をしたかったのですが、この「after_commit後の判定」というところでひっかかりました。しかも子モデルのテーブルだったのでなおさら…?

# 親モデルと子モデルの関係

“`ruby

# User.rb(親モデル)
class User < ApplicationRecord has_many :posts end # Post.rb(子モデル) class Post < ApplicationRecord belongs_to :user end ``` # DBにガッツリ保存された後に判定する もうどうしようもないと挫けそうでしたが(笑)なんとか方法があったので書きます。 保存する前であれば、さまざまメソッドはあります。 attr_was(現在は非推奨のようですが…)したり、changesやp

本番環境でデータを削除、気をつけたいこと5選

# はじめに
本番環境のデータ削除は通常の開発プロセスとは似ているようで非なる作業です。
最初から別物として捉えて作業を始める必要があります。
この記事では、本番環境のデータ削除をするときに気をつけたいこと5つを紹介していきます。

# 1. 工数を過小評価しない
データ削除を行う場合、調査なしで正確な見積もりをすることはほぼ不可能です。
どんなにかんたんに思えても、作業を完了するために少なくとも2週間はかかると考えたほうが無難です。
なぜなら、次の項で述べるような質問に答えるための調査をする必要がありますし、コレでいけると思ったコードではパフォーマンスが出ず、書き直す必要がある。といった事態も起こりうるからです。
チームとしてある程度時間がかかるものという共通認識を持つことが大切です。

# 2. 事前調査をする
作業に取り掛かる前に、以下の質問に全て答えるための調査をしましょう。
すべての質問に答えることができたら、コーディングに取り掛かりましょう。

* 削除することになるレコード数はどのくらいか?
* どうやって対象のデータが削除されたこと、対象外のデータが削除されていないこ

【RSpec】let にパラメータを渡したい

## はじめに

letにパラメータ(引数)を渡す方法です。
通常であればヘルパーメソッドで定義したり変数の部分をletで置いたりするなどと思いますが、選択肢の一つになれば幸いです。

## やりかた

lambdaで渡す(Procでも可)。

“`
# 定義の仕方
let(メソッド名) do
->(引数) { 処理 }
end

# 呼び出しかた
メソッド名.call(引数)
“`

例題

“`
# 定義
let(:say_something) do
->(sth) { p sth }
end

# 呼び出し
before do
say_something.call(‘hogehoge’)
say_something.call(‘piyo’)
end
“`

## おわりに

意外と知らなかったところだったので共有でした。

【Ruby】整数を16進数化するメソッドの作成でリファクタリングに触れる

# やりたいこと

自分のコードのリファクタリングがしたい⋯
でもなにから手をつけていいかわからない⋯

そんな気持ちを抱えるなか、現在勉強中の「プロを目指す人のためのRuby入門」にて、メソッドを作成する過程でのリファクタリング手順について触れられていたのでその流れについて自分用のメモ、アウトプットです。

# 整数を16進数化するために使用するメソッドの作り方

## 作成イメージ
3つの整数を受け取り、16進数に変換するto_hexメソッドを作成します。

“`ruby
to_hex(0, 0, 0)
# => ‘#000000′
“`

## 16進数化メソッドで使用するメソッド
リファクタリングの前に、このメソッドを作成するために使用するメソッドについて学習 ✎

### メソッド① to_sメソッド:整数を16進数に変換する
整数を16進数にするためにはto_sメソッドが使える。

“`ruby
0.to_s(16)
# =>’0’
255.to_s(16)
# => ‘ff’
“`

to_sメソッドは、文字列以外のオブジェクトを文字列に変換するメソッドと認識し

【Rails】Capistranoでvirtual memory exhaustedと言われて、デプロイ出来なくなった

# 症状
このコマンドでデプロイしました。今まで特に問題は起きておらず、変化点も特にないはずなのに、急にデプロイできなくなりました。

“`
$ bundle exec cap production deploy
“`

このようなメッセージがでてしまいます。(詳しいエラー文は残っていません、すみません)

“`
virtual memory exhausted
“`
調べてみると、どうもEC2のメモリ不足らしい。

# 調査
まずは、SSHログインします。

“`terminal
$ ssh アプリ名
Last login: Mon Mar 1 10:59:29 2021 from 122-222-130-5.east.ap.gmo-isp.jp

__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|

https://aws.amazon.com/amazon-linux-2/
/home/****/.rbenv/libexec/rbe

ruby-jmeterを使ってRailsアプリの負荷試験を継続的に行えるよう準備する

私はパフォーマンスチューニングが得意なこともあり、負荷試験を行う場面がそこそこあります。負荷試験ツールにはいろいろなものがありますが、古くからあり情報も多い[JMeter](https://jmeter.apache.org/)を使うケースは今でもそれなりに多いと思います。JMeterはGUIで設定ができて手軽なのですが、複雑なシナリオをGUIでポチポチ作るのは面倒です。シナリオをXML形式で出力することもできますが、XMLは読み書きしづらいですし、[JMeterのGUIでシナリオを実行してはいけない](https://jmeter.apache.org/usermanual/get-started.html#load_test_running)とのことです。それなら最初からわざわざGUIを起動したくないですよね。

そこで、RubyのDSLでJMeterのシナリオを記述できる__ruby-jmeter__を使って、Ralisアプリの負荷試験を継続的に行う環境を作っていきます。

https://github.com/flood-io/ruby-jmeter

# JMeterをインス

Railsの【flash】を自分なりに噛み砕いた(3部作その3)

`flash`を理解する過程で、`params`や`session`についても理解できたのでまとめ
長くなりそうだったので、`1:params`、`2:session`、`3:flash`の3回に分けた

####【3部作リンク】
[1:params](https://qiita.com/masahiroDIARY/items/68c5294c8160ef6499c5)
[2:session](https://qiita.com/masahiroDIARY/items/4b442b149d0dc9a42eb0)
3:flash(ここ)

####【ページ内リンク】
[0.環境](#0環境)
[1.利用方法](#1利用方法)
[2.結論](#2結論)

#0.環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

#1.利用方法
###順序①:Controller指定
“`rb:examples_controller.rb
その1:flash = {notice: “noooo”

【Rails】assert_matchの使い方

assert_match

Railsテストで使うメソッドで、第一引数の正規表現の値と第二引数の値がマッチすれば成功になるメソッドです。

第三引数にメッセージを設定すると、失敗時のメッセージを指定できます。(指定は任意です)

また、HTMLを評価する際に、assert_selectではタグを指定する必要がありますが、assert_matchではタグを指定する必要がありません。

““ruby:assert_match
#基本構文
assert_match(正規表現, 文字列 [, メッセージ])

#HTMLを評価するときの使い方(Railsチュートリアル第13章より)
assert_match @user.microposts.count.to_s, response.body

“`

参考

Rails ドキュメント
https://railsdoc.com/test

Ruby STUDIO Railsのテスト
http://ruby.studio-kingdom.com/rails/guides/testing#2

Ruby on Rails deviseのインストール

ログインに使うgem「devise」をインストールする。
一. Gemfileに以下を追記

“`
gem ‘devise’
“`

二. インストール

“`
bundle install
“`

三. 設定ファイルを生成

“`
rails g devise:install
“`

四. 認証用ファイルの生成(Userの名称は任意で、生成したいmodel名で作成)

“`
rails generate devise User
“`

とりあえずインストールはしたものの、ここから拡張していくのが難しい。

《Ruby on Rails》超簡単にいいね機能を実装する方法を発見!!

#はじめに
いいね機能を色々調べてみましたが、
簡単な機能の割に物凄くややこしく複雑なコードと量で非常に効率が悪いようやきがしていて、もっとシンプルで簡単な方法を探してました。
おそらくこのやり方が1番シンプルなやり方だと思い、共有したく投稿しました。
参考になれば幸いです!!

##環境
Ruby 2.5.1
Rails 5.2.4.5
MySQL
Cloud9

##前提
投稿をpostで定義済。
deviseインストール済。

##目的
Twitterの様に全ての投稿に対しいいね機能を付けたい!

##①モデルの生成
“`
$rails g model like user_id:integer post_id:integer
“`
↑モデル名はlikeでカラムをuser_idとpost_idで作成。

“`
rails db:migrate
“`
↑データベースへ反映。

##②アソシエーションを定義

“`user.rb
has_many :likes
“`
↑userテーブルとlikeテーブルとは1対多の関係なのでhas_manyでアソシエーションを定義。

`

【Rails】activerecord::recordinvalid:エラーの解決法【CSV】

#はじめに
現場で使える Ruby on Rails 5速習実践ガイド
「Chapter 7 機能を追加してみよう」の「7-6-2CSVデータを入力(インポート)する」で若干詰まったのでメモ。
#環境
Ruby 2.6.6
Rails 6.1.3
#エラー出現
models、controllers、views、routesに参考書通り記載し、
現れたインポートボタンにmac付属のテキストエディットでcsvファイルを作成しアップロード!
すると、、、
「activerecord::recordinvalid:バリデーションに失敗しました: 名称を入力してください:」と出現。
書いたコードを見返してもタイポ等は見つからず、、、
エラー画面にはtask.save!の所にマーカーが引かれていたので、モデルを確認することにした。
#app/models/task.rb
まず処理のロジックを確認する。

““ruby:task.rb
def self.import(file) #–1)
CSV.foreach(file.path, headers: true) do |row| #

Railsの【session】を自分なりに噛み砕いた(3部作その2)

`flash`を理解する過程で、`params`や`session`についても理解できたのでまとめ
長くなりそうだったので、`1:params`、`2:session`、`3:flash`の3回に分けた

####【3部作リンク】
[1:params](https://qiita.com/masahiroDIARY/items/68c5294c8160ef6499c5)
2:session(ここ)
[3:flash](https://qiita.com/masahiroDIARY/items/d2d81f55fd695eb9d44e)

####【ページ内リンク】
[0.環境](#0環境)
[1.前提知識](#1前提知識)
[2.利用例](#2利用例)
[3.結論](#3結論)

#0.環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

#1.前提知識
`session`も値ではなく**ハッシュ**!!!!!(←超重要)

[ページ内リンクへ戻る](#ページ内リンク)

#2

Rubyのnilについて

参考文献 プロを目指す人のためのRuby入門より
参考サイト▶︎[Rubyリファレンスマニュアルより](https://docs.ruby-lang.org/ja/latest/class/NilClass.html)
参考記事▶︎[Ruby の nil は無か?](https://qiita.com/scivola/items/da2480ca4597a7dcf73d)

間違いあればご指摘いただければ幸いです。

## はじめに
Rubyはオブジェクト指向言語であり、文字列や配列、数値に関しても、全てがオブジェクトです。

そして今回焦点を当てる**「nil」**もオブジェクトの一つです。

# nilとは?
nil は**何かが存在しないことを表すために用いられるオブジェクト**のことです。
お恥ずかしながら、つい先程まで「nil」とは、何も存在しないことだと認識をしていましたがこれは間違いです。
存在してないことを教えてくれる役割も持っています。

# 真偽値のnil
Rubyの特徴とも言える真偽値のnilについてです。

Rubyでは真偽値のルールとして、以下の2点があります

【Railsチュートリアル】第13章 ユーザーのマイクロポスト④

# 13.4 マイクロポストの画像投稿
* 画像付きマイクロポストを投稿できるようにする

## 13.4.1 基本的な画像アップロード
* Railsに組み込まれているActive Storageという機能を用いる

### 演習 1
画像付きのマイクロポストを投稿してみましょう。もしかして、大きすぎる画像が表示されてしまいましたか?(心配しないでください、次の13.4.3でこの問題を直します)。

確認のみなので省略。

### 演習 2
リスト 13.64に示すテンプレートを参考に、13.4で実装した画像アップローダーをテストしてください。テストの準備として、まずはサンプル画像をfixtureディレクトリに追加してください(リスト 13.63)。リスト 13.64で追加したテストでは、Homeページにあるファイルアップロードと、投稿に成功した時に画像が表示されているかどうかをチェックしています。なお、テスト内にあるfixture_file_uploadというメソッドは、fixtureで定義されたファイルをアップロードする特別なメソッドです18 。ヒント: image属性が有効か

RubyXLで最初のシート(テンプレート)から複数のシートを作成する2

以前書いた記事の続報です。前回の記事だけでは解決できない2つの不具合に遭遇しましたので情報を共有します。
https://qiita.com/DYO/items/bbdac8a9521cdaf5757e

– 計算式がコピーされない
– 計算が反映されない

こちらは前回までコードの一部でテンプレートのセルを新しいセルにコピーするメソッドです。

“`
def cell_render(template_cell, row_num, col_num)
cell = @worksheet.add_cell(row_num, col_num, content_eval(template_cell.value))
cell.style_index = template_cell.style_index
end
“`

テンプレートのセルが計算式の場合は `template_cell.value` の中身は”かnilになるので計算式はコピーされませんでした。

そこで以下のようにしました。

“`
def cell_render(template_cell,

【Railsチュートリアル】第13章 ユーザーのマイクロポスト③

# 13.3 マイクロポストを操作する
* データモデリングとマイクロポスト表示テンプレートをWeb経由でそれらを作成するためのインターフェイスに取り掛かる

## 13.3.1 マイクロポストのアクセス制御

関連付けられたユーザーを通してマイクロポストにアクセスするので、createアクションやdestroyアクションを利用するユーザーは、ログイン済みでなければならない。

“`ruby:test/controllers/microposts_controller_test.rb
require ‘test_helper’

class MicropostsControllerTest < ActionDispatch::IntegrationTest def setup @micropost = microposts(:orange) end test "should redirect create when not logged in" do # ログインしていないときに作成するとリダイレクトされるか検証するテスト assert_no_

Railsの【params】を自分なりに噛み砕いた(3部作その1)

`flash`を理解する過程で、`params`や`session`についても理解できたのでまとめ
長くなりそうだったので、`1:params`、`2:session`、`3:flash`の3回に分けた

####【3部作リンク】
1:params(ここ)
[2:session](https://qiita.com/masahiroDIARY/items/4b442b149d0dc9a42eb0)
[3:flash](https://qiita.com/masahiroDIARY/items/d2d81f55fd695eb9d44e)

####【ページ内リンク】
[0.環境](#0環境)
[1.前提知識](#1前提知識)
[2.利用例](#2利用例)
[3.ストロングパラメータ](#3ストロングパラメータ)
[4.結論](#4結論)

#0.環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

#1.前提知識
この2つは**同義**。よく考えたらRubyで勉強したハッシュの仕

Leetcode(Easy問題) でRubyの勉強をしてみました! <備忘録>

# 概要
プログラミング初心者でWebアプリケーションを制作していますが、
それだけではプログラミングの知識が浅いためLeetcodeで勉強をしました!

何問か解きましたが、勉強になったことが多いので備忘録として残しておこうと思います!
もっと綺麗な書き方あるよーって教えてくれる方がいたら是非コメントにお願いします!
(※解いた順なので、番号は前後します。)
(※他の方の解答を参考にした問題もあります。)

# 1672. Richest Customer Wealth
You are given an m x n integer grid accounts where accounts[i][j] is the amount of money the i​​​​​​​​​​​th​​​​ customer has in the j​​​​​​​​​​​th​​​​ bank. Return the wealth that the richest customer has.

A customer’s wealth is the amount of money they have