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

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

【RSpec】Railsのモデルスペックでバリデーションのテストは書くべきか否か?

## はじめに:単純なバリデーションならテストコードは不要(という私見)
Railsでモデルスペックを書くとき、バリデーションのテストを書く人をよく見かけます。
たとえば以下のようなイメージです。

“`ruby
class User < ApplicationRecord validates :name, presence: true end ``` ```ruby RSpec.describe User, type: :model do # こういうテストは書く?書かない?? describe 'validation' do example 'nameは必須' do user = User.new(name: '') expect(user).to be_invalid user.name = 'Alice' expect(user).to be_valid end end end ``` 決して、バリデーションのテストを書くことが悪いことだとは言いませんが、個人的には単純なバリデーションで

元記事を表示

N+1問題のイメージ画像

![スクリーンショット 2022-08-21 10.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/8af891e4-c146-6488-7379-531b670a4e49.png)

N+1問題の説明です。1:Nというのは1ユーザーに対してN個の投稿データが存在することをさします。

![スクリーンショット 2022-08-21 10.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/61c96efb-1d08-f07d-a868-f12d3e294db7.png)

![スクリーンショット 2022-08-21 10.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/b70935c0-1141-c2ad-b83e-2a99edf9eb48.png)

![スクリ

元記事を表示

【Rails】devise_invitableで招待メールからパスワード登録したユーザのリダイレクト先を変更する

## deviseとdevise_invitable
deviseとはRailsで作成したアプリケーションへ簡単に認証機能を実装することができるgem(ライブラリ)の一つで、devise_invitableはdeviseに招待機能を追加するgemになります。

### やりたいこと
devise_invitableで招待メールを送信

パスワード設定用の招待メールが送られてくる

パスワード設定

希望の画面にリダイレクトする (今回はこれをやりたい

### 問題点
パスワードを設定すると自動でログインしてくれるのですが、
設定後にroot_pathに遷移してしてしまう。

### ハマったところ
deviseには元来`after_sign_up_path_for`(登録後のリダイレクト先を変更できるメソッド)や
`after_sign_in_path_for`(ログイン後のリダイレクト先を変更できるメソッド)が存在しており、
招待メールからパスワードを設定したのちに自動でログイン状態になっているので同様のやり方でいけると思っていました。

* `after_sign_up_p

元記事を表示

【Railsチュートリアル】benchmark-ips gemで処理の実行速度を計測してみる

Railsチュートリアルの第4章に以下のような問いがあります。

>Rubyのbenchmark-ips gemを使い、ハッシュのキーを「数字」「 文字列」「シンボル」にした際のそれぞれの実行時間を測定してみましょう。
>Railsチュートリアル第4章より

4章までの復習兼ねて解いていきます。

まずbenchmark-ips gemをインストールします。
“`ruby:Gemfileへ追記
group :development, :test do
(省略)
gem ‘benchmark-ips’
end
“`
本番環境ではいらないと思うので、開発・テストのみのインストールとしました。
“`ruby:コマンド実行
$ bundle install
“`
上記コマンドだと、インストール済みのものはインストールされず追記したbenchmark-ips gemのみインストールされます。
“`ruby:実行結果

Using ansi 1.5.0 #インストール済みのgemはUsingとなっている
Fetching benchmark-i

元記事を表示

rbenvでRubyのバージョン切り替えをする方法

## 概要
以下の記事を参考に勉強を進めており、Rubyのバージョンを指定する必要があったため、rbenvでバージョン切り替えてみました。

https://zenn.dev/hibriiiiidge/books/49ee4063b10cec1df1a2/viewer/dc751838fa3715f814dd

## 方法
rbenvのインストール
“`
brew install rbenv ruby-build
“`

rbenvのインストール確認
“`
rbenv -v
“`

ruby 2.6.6のインストール
“`
rbenv install 2.6.6
“`

ruby 2.6.6のローカル使用指定
“`
rbenv local 2.6.6
“`

bash_profileを開く
“`
vi ~/.bash_profile
“`

以下を追加
“`
eval “$(rbenv init -)”
“`

設定を反映
“`
source ~/.bash_profile
“`

rubyのバージョン確認
“`
ruby -v
ruby 2.6.6p14

元記事を表示

【Rails】devise 管理者が他のユーザーの新規登録ができるようにする

# 【Rails】devise 管理者が他のユーザーの新規登録ができるようにする

### devise

deviseを使用してユーザー登録機能を実装した際に、管理者としてログインをし他のユーザーの新規登録ができるようにしたいとします。
しかし、そのままの状態で新規登録をしようとするとroot_pathにリダイレクトされてしまい新規作成画面に遷移できません。

## rails g devise:controllers users

本来deviseのコントローラーはGem内に記述されているため編集することはできません。
しかしdeviseのユーザー登録機能はregistrations_controller.rbで定義されているため、このファイルをどうにかしなくてはいけません。
そこで、このcontrollerをオーバーライドしてカスタマイズをしていきます。

まずはオーバーライドするためのファイルを作成します。
“`
$ rails g controller users/registrations
“`
これで編集するファイルapp/controllers/users/regi

元記事を表示

文字列演算子 << の意味

たまに出てくるこれ    <<

どういう意味なのか?

<<  文字列演算子といい、
配列で自信の末尾に破壊的に値を追加してくれます。

下の文で確認します。

“`
  class Food
 @@foods = [ ]
    def self.input
  puts “料理名を入力してください”
          name = gets.chomp
      puts “カロリーを入力してください”
calory = gets.to_i

  food = Food.new(name,calory)
  @@foods << food end ``` @@foodsにfoodの値を追加しています。 わかりやすくいうと、@@foodsにfoodのnameとcaloryの値を追加しているということです。

元記事を表示

【Ruby】putsの戻り値はnil

rails consoleで以下のメソッドを試したところ混乱したので、備忘録として書き留めます。

“`
$ rails c

?> def palindrome_tester(s)
?> if s == s.reverse
?> puts “palindrome”
?> else
?> puts “not palindrome”
?> end
?> end
=> :palindrome_tester

>> palindrome_tester(“racecar”)
palindrome
=> nil

>> palindrome_tester(“asdfg”)
not palindrome
=> nil
“`

上記の”=> nil”の部分が毎回出力されるのが不明だったのですが、putsは文字列を出力した後、nilを返しているだけでした。

元記事を表示

本番/開発/テスト環境の違いがわからなかったのでとてもざっくり整理した。

はじめに

RSpecが403エラー(存在はしてるけど、アクセスできないよ!)を返して、テストが実行できない事態に襲われたことがありました。

原因はDockerfileで”RAILS_ENV”に開発環境を設定していたことにより、RSpecが開発環境で実行されるように記述されていたことでした。
~~~./Dockerfile
RAILS_ENV: development
~~~

~~~.spec/rails_helper.rb
ENV[‘RAILS_ENV’] ||= ‘test’

#修正後
ENV[‘RAILS_ENV’] = ‘test’
~~~

エラーを解消することができてよかったのですが、よく目にする3つ環境(本番/開発/テスト環境)の違いがいまいちわかっておらず、解決後もピンときてなかったので、調べてみました。

備忘録として残そうと思います。

開発環境 (config/environments/development.rb)

appディレクトリ以降のファイルに変更があった時に、自動で読み込んでくれる。
例えば、controllerの記述を変更したり、vi

元記事を表示

【Rails】bundler: failed to load command: puma 解消法

## 状況
`bundle exec puma -C config/puma.rb`を実行したところ以下のとおりエラーとなりました。

“`:ターミナル
$ bundle exec puma -C config/puma.rb
Puma starting in single mode…
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
bundler: failed to load command: puma (/PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma)
Errno::ENOENT: No such file or directory @ rb_sysopen – tmp/pids/server.pid
/PRJ_ROOT/vendor/bundle/ruby/2.5.0

元記事を表示

【やっとわかった】self.っていつ使うん?(実務コードから見たクラスメソッド、インスタンスメソッドの使い分け)

## はじめに
Rubyのコードでたまに**self.name**みたいな感じでselfがついているコードをしばしば見かけるときがあります。Java、C#、Javascriptだとthisみたいなものですが、そもそもこのselfって「何を意味してるの?どんなときに使うの?」と疑問に思っていました。

今回Rubyの参考書でチェーリー本として有名な[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%

元記事を表示

Railsでdb:migrateやdb:rollbackができなくなったときの対処方法

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Migrateをする際にテーブルが外部のテーブルに依存する(外部キーなど)ときに、うまくmigrateやrollbackができないことがあります。一部レコードが外部キーを持っている状態のままレコードに入っていたりするので起きていることがあります

# 対処方法

まずは参照元、参照先のテーブルを削除していきます

“`
$ rails c
$ Model1.destroy_all
$ Model2.destroy_all
“`

ここではmigrateしたいテーブルにModel1とModel2が紐づいていると仮定しています

またmigrateは途中まで成功しているとロールバックしないので(migrateファイル単位で判断するので失敗したときにはそのファイルの内容のみをロールバックしているので成功したファイルはロールバックされない)、`duplicated`というエラーが出た場合は

元記事を表示

Railsで途中からDBをsqlite3からmysql2に変更するだけなのに死んだ【9日目】

# 前提
– develop環境でsqliteを使うと、production環境(AWS)への移行が面倒そうなので、mysqlに変更しようと思った(本番はmysqlを使いたいから)
– まだ1度も`db:migrate`していない状態から作業した
– そもそも`rails new アプリ名 -d mysql`でデフォルトのDBをmysqlにできる
– ruby “3.1.2”
– rails “7.0.3.1”
– M1MacBookPro

# 最初の躓きポイント
– Gemfileからsqlite3を消し、mysql2を追加して`bundle install`でエラー
– `ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)`
– 原因はmysqlをPCにインストールしてなかったこと
– homebrewでmysqlをインストールしたらパス

# 次の躓きポイント
– config/database.ymlをmysql用に書き直す
– 具体的には、`

元記事を表示

windowsでdockerのvolume指定するときに環境変数使ったら;Cついてくる問題

対処ができればとりあえず良いと思うんで事象と対処について説明
### 環境
windows
vscodeでgitbash使用
docker desktop使用
### 事象
イメージ作って以下コマンド実行
“`
docker container run -it -p 4567:4567 –name sinatra -v “${PWD}/srcs”:/var/www sample/sinatra:latest
“`
↓file sharing エラー発生(これは大したことないが)
“`
docker: Error response from daemon: user declined directory sharing C:\Users\S724\Downloads\github\docker_ruby_yamaura\docker\src;C.
↑なんかパスの末尾に;Cついてるうう
“`
心配になりつつfile sharingの設定をdocker desktopで設定
すると。。。
src;Cファイルが実際に作成されてしまっていたのです。
さらにファイル作ったりしてもdock

元記事を表示

“||”はどんな時に使うのか?

はじめに

ポートフォリオを作成していく中で、「これ何してるの、、?」というコードに出会うことがしばしばあります。
やはり何をするにも土台が大切だろうと言うことでわからないことを一つ一つ調べて備忘録として残していこうと思います。
千里の道も一歩から!

or演算子

左辺を最初に評価し(真偽値かどうか調べる)、偽だった場合に右辺を評価する。
~~~rb
# trueを返す
false || true

#3は真なので左辺で3を返す
3 || 5

# trueを返す
false || nil || true

#trueを返す(trueの箇所で評価は終了。nilの箇所は評価すらしていない)
false || true || nil
~~~

自己代入演算子

aが偽か未定義だった場合、aに左辺(今回はhoge)を代入する。

~~~rb
#hogeが返ってくる
a ||= hoge
puts a #=>hoge

#hogeが返ってくる(既にaにはhogeが代入されているので、pogeは代入されない)
a ||= poge
puts a #=>hoge
~~~

元記事を表示

配列をネストしたブロックに変換する

# やりたいこと

配列をネストしたブロックに変換したい。

たとえば、ブロックを受け取る transaction という共通の名前のクラスメソッドを持ったクラス CuteDB, CoolDB, EpicDB があるとして

“`rb
nested_transactions([CuteDB, CoolDB, EpicDB]) do
hoge
end
“`

“`rb
CuteDB.transaction do
CoolDB.transaction do
EpicDB.transaction do
hoge
end
end
end
“`

という構造に変換したい。ネストする順番を動的に決定するのが目的。

# 方法

Proc オブジェクトと Enumerable#inject を利用する。

(@kts_h さんのコメントのおかげで nested_transactions メソッドの実装がシンプルになりました :pray::sparkles:)

“`rb
module CuteDB
def self.transaction

元記事を表示

ポートフォリオとして家事×バトルというwebアプリを作った。

# はじめに
ポートフォリオとして作成したWebアプリケーションの紹介記事です。

作成したアプリの概要
– 「家庭内の家事分担割合を可視化する」ことを目的に作ったWebアプリケーションです。
– サービス名は「家事×バトル」としました。
![スクリーンショット 2022-08-19 9.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948501/343208f9-01bb-2b68-0dae-be9e1cc9e3ca.png)

日々家事をこなしていると、夫と妻どちらが家事を多く実施しているか、客観的に評価することが難しいと思い、
実施した家事の量を集計して、比較することができるアプリを作成しました。

アプリのURLはこちらです。
https://kazi-battle.herokuapp.com/

githubのソースコードはこちらです。
https://github.com/shosuke1989/kazi-battle

# アプリの使用方法
別ページにまとめました。以下のリンク

元記事を表示

【Rails】nilを最後にソートしたい

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
“`User“`を“`Post“`の“`category_id“`の降順かつ“`nil“`を最後にソートしたいとき、このように書くと

“`ruby
User.eager_load(:posts)
.order(‘posts.category_id IS NULL’)
.merge(Post.order(category_id: :desc))
.select(‘users.*’, ‘posts.category_id AS posts_category_id’)
“`

下記のエラーと
“`
for SELECT DISTINCT, ORDER BY expressions must appear in select list
“`

下記の警告が出る。
これについては伊藤さんの記事がとても参考になりました。

“`
DEPRECATION WARNING: Dangerous query method (method who

元記事を表示

Python,Ruby,PHP,Java,JavaScript,Perlの文字列処理の比較

Python,Ruby,PHP,Java,JavaScript,Perlの文字列処理の比較

# Python

https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887

# Ruby

https://qiita.com/kyohei-horikawa/items/b3308601931c20074c31

# PHP

https://qiita.com/chimayu/items/9b9cb14548aa7dd8da1b

# Java

https://qiita.com/suema0331/items/a3c947076ee1a0c6037a

# JavaScript

https://qiita.com/saka212/items/11ce1f1d6316c1fbf15b

# Perl

https://perlzemi.com/blog/20161003147558.html

元記事を表示

Webpacker動かない

rails sしてプレビューすると
~~~ruby
Webpacker::Manifest::MissingEntryError in Homes#top
Showing /home/ec2-user/environment/Rails6_ojt_test/app/views/layouts/application.html.erb where line #9 raised:

Webpacker can’t find application.js in /home/ec2-user/environment/Rails6_ojt_test/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to re

元記事を表示

OTHERカテゴリの最新記事