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

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

RSpecのテストコードの大まかな流れ

# アウトプット

各テストにおいて、必ず踏むステップは下記の通りである。

1. テストの前に`before`を使用してFactoryBotの生成

2.
[モデル単体テスト]
example毎にインスタンスの値を変更

[コントローラー単体テスト]
`get`でリクエストを送りたいパスを指定

[結合テスト]
`visit`で移動したいページに遷移

3. expectation構文で挙動の確認

4. bundle exec rspecコマンドでテストコードの実行

# 学んだこと
RSpecのテストコードは、種類によって記述も変わるが、
大まかな流れや共通点を見つけると、「次に何を記述すべきか」が掴みやすくなった。

元記事を表示

【LeetCode】110. Balanced Binary Treeを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの110. Balanced Binary Treeを解いていく。

## 問題文を和訳
– 二分木が与えられた場合、それが高さのバランスが取れているかどうかを判断します。
– この問題では、高さのバランスが取れた二分木は次のように定義されます。
– すべてのノードの左右のサブツリーの高さが1以下しか異なる二分木。
– Input: root = [3,9,20,null,null,15,7]
– Output: true

## 回答
“`110_BalancedBinaryTree.rb
def is_balanced(root)
return depth(root) >= 0
end

def depth(root)
if root == nil
return 0
end
left = depth(root.left)
right = depth(root.right)
if (left – right).abs > 1 || left < 0 || right < 0 retu

元記事を表示

Mailerでmissing templateになってしまった

![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525610/951586bb-b754-8987-fa59-ba2c02f6e599.png)

https://qiita.com/ki_87/items/67f8965e8de17e95ac1c

コチラのサイトを参考にさせていただきメールの送信機能を実装しました。
ですが、上記のエラーが出てしまいました。なぜ。。。。

###### こいつは馬鹿です

いや誤字はない。どこが。。。おかしいんだ。。。

###### こいつは馬鹿です

何で!なんで!お父さん帰ってこないんだよ!!

###### ※関係ありません

答えは簡単。
彼は見落としていました。

~~~view/contact_mailer/send_mail.text.erb
===============================
<%= @mail_title %>
===============================

元記事を表示

SSLクライアント証明書を使ってRubyのFaradayで通信する方法

詰まったのでメモします

# 前提
– Ruby: 2.7
– Faraday: 2.2.0

# コード

“`ruby
# urlは通信先のURL
url = ‘https://example.com’
connection = Faraday.new(url: url) do |faraday|
faraday.request :url_encoded
faraday.adapter :net_http
# ファイル名は各自のファイル名
faraday.ssl.client_cert = OpenSSL::X509::Certificate.new(File.read(‘ssl_client.crt’))
builder.ssl.client_key = OpenSSL::PKey::RSA.new(File.read(‘ssl_client.key’))
end

connection.get(url) do |req|
req.headers[‘Content-type’] = ‘application/json’
end

元記事を表示

【Docker】駆け出しエンジニアがDocker公式チュートリアルに躓きまくった件

可能な限りDocker公式が提供しているチュートリアルに沿って、Ruby on rails + MySQLの環境構築を行います。

## はじめに
こんにちわ、2022年4月よりエンジニアとして働き始めたばかりのUdai(ゆうだい)です!

今回は、Docker公式チュートリアルを行った際に大量のWorningやErrorに苦しんだので、これからチュートリアルに訪れる初学者の同士が同様に躓かないようにと思い筆を取りました。

如何せん、私はまだまだ駆け出しのエンジニアですので、本記事はDockerを知らない人や名前だけは知っているよといった初学者向けの記事となっております。そのため、粒度はかなり細かいものとなっております。

また、それでも一読してくださる寛大なシニアなエンジニアの先輩方は記事の内容に誤りがございましたら、遠慮なく指摘・訂正していただけると幸いです。

※ 注意点
– チュートリアルとデータベースが異なります。(PostgreSQLからMySQLへ変更)
– 手早く同上の環境構築を行いたい方は他の素晴らしい記事を参照してください。

## 対象
– 実際にDockerを

元記事を表示

Ruby 無限ループで each_with_index のようなカウント数を得る

# コード例

“`rb
(1..Float::INFINITY).each { |i| p i }
“`

# 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7d8aec45-3622-31d1-7825-34e98926fba3.png)

元記事を表示

Rubyでじゃんけんを作る プログラングの練習

# 何?

– 人数を指定してじゃんけんをする
– 勝敗がつくまでじゃんけんを続けて、勝敗がついたら試行回数を数える

# コード

“`ruby

variations = [“G”,”C”,”P”]

MEMBER = ENV[“MEMBER”].to_i || 3

puts “JANKEN!”
puts “#{MEMBER} members”

try_count = 0

loop do
cards = []
try_count += 1

MEMBER.times do
cards.push variations.sample
end

puts cards.join(” “)

# 勝敗が決まった場合
# じゃんけんで勝敗が決まるのは、手の種類が2個の場合である
if cards.uniq.count == 2
break
end
end

puts “#{try_count} tried”
“`

# 実行例

![image.png](https://qiita-image-store.s3.ap-nort

元記事を表示

FactoryBotを使用した2通りのインスタンス生成

# アウトプット
`FactoryBot.build(:モデル名)`は、ActiveRecordのnewメソッドと同様の意味を持つ。
新しいインスタンスを生成し、それに対するテストを行う際に用いる。

`FactoryBot.create(:モデル名)`は、ActiveRecordのcreateメソッドと同様の意味を持つ。
既にデータベースにインスタンスが登録されている状態で、テスト行う際に用いる。

# 学んだこと
buildメソッドは、主に下記のテストで使用する。
– ユーザー機能モデル単体テストコード
– データ機能モデル単体テストコード
– ユーザー新規登録機能結合テストコード

createメソッドは、主に下記のテストで使用する。
– データ機能コントローラー単体テストコード
– ユーザーログイン機能結合テストコード
– データ機能結合テストコード
– コメント機能結合テストコード

元記事を表示

Railsのbinding.irbで処理を止めて変数に代入しようとするとArgumentErrorがでる

# エラーの説明
動作などを確認する際にbinding.irbで処理を止めて変数に値を代入するような処理を行うと
このようなエラーが表示される。
エラーが表示されても変数の代入は行われるし、
binding.irbで処理を止めない場合も問題なく処理は行われる。
なお、binding.irbを記載する箇所、変数や値はどれでもエラーが出るので関係ない模様。
“`
irb:001:0> a = 1
/Users/ユーザーネーム/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/hirb-0.7.3/lib/hirb/view.rb:186:in `output_value’: wrong number of arguments (given 1, expected 0) (ArgumentError)
from :5:in `irb’

元記事を表示

【Rails】loggerの出力をminitestでテストする方法

コントローラのテストをする際に、logger出力のテスト方法につまったので、備忘録として残します。他にいい方法があれば教えていただけると幸いです。

## バージョン

Rails 6.1.5

## 実装方法

適当なアクションに遷移した時にlogを吐く場面を想定します。

“`ruby
class XXXController < ApplicationController def index logger.info "通ったで" #ここを検出したい end end ``` ログの内容をテストします。 ```ruby # stubを使用するために必要 require 'minitest/mock' # 略 test 'logger.info を出力' do http_method = lambda { get staffs_path } logs = get_logs(http_method) expected_message = "通ったで" assert_log(logs,expected_message) end # 略 #

元記事を表示

Gem 名の命名規則について

ユーザに Gem の読み込み方針を提示するために、命名規則が推奨されている

https://guides.rubygems.org/name-your-gem/

実際には、↑ の命名になっていない Gem もあるけど、デファクトスタンダードとして知っておく

# ① クラス・モジュール名に複数単語が含まれる場合
単語を `_` 区切りにする

require 先と同じ表記になるので、ユーザーフレンドリー

例えば、

– Gem 名は `ruby_parser`
– require 先は `〃`
– クラス・モジュール名は `RubyParser`

# ② 別の Gem を拡張する場合
拡張元を `-` 区切りにする

[require先は `/` 区切りとなり](https://ruby.studio-kingdom.com/bundler/guides/bundler_setup#:~:text=%E9%8B%AD%E3%81%84%E8%AA%AD%E8%80%85%E3%81%A7%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81rack%2Dc

元記事を表示

【LeetCode】108. Convert Sorted Array to Binary Search Treeを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの108. Convert Sorted Array to Binary Search Treeを解いていく。

## 問題文を和訳
– 要素が昇順でソートされる整数配列numsが与えられた場合、
– それを高さバランスのとれた二分探索木に変換します。
– 高さバランスのとれた二分木は、
– すべてのノードの2つのサブツリーの深さが1つより大きく異なることのない二分木です。
– Input: nums = [-10,-3,0,5,9]
– Output: [0,-3,9,-10,null,5]
– Explanation: [0,-10,5,null,-3,null,9] is also accepted:

## 回答
“`108_ConvertSortedArraytoBinarySearchTree.rb
def sorted_array_to_bst(nums)
if nums.length <= 0 return nil end middle = nums.length / 2 root

元記事を表示

rails6 systemdの書き方について

# はじめに
初めてsystemdを書いた時の自分への戒めとして、こちらを書こうと思います。

# 環境
ruby 3.0.2
rails 6.1.4
puma 5.4

# 参考URL
https://www.rochefort.dev/posts/puma-systemd/

# エラー
“`
$ sudo journalctl -fp err
systemd:Failed at step CHDIR spawning /home/ec2-user/.rbenv/shims/bundle: No such file or directory
“`
単純に「bundleのファイルかディレクトリがありません」と思い確認してみた所、存在しています。
# 対象コード
“`
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]

Type=notify

WatchdogSec=10

User=tomo

WorkingDirectory=/var/www/my_app/current

Environ

元記事を表示

【備忘録】Railsリレーション検索・作成総集

– ユーザー VS 性別(1:多)
– ユーザー VS スキル (多:多)

## 1:多(検索)
“`
User.find_by(sex_id: 1)
“`

## 多:多(検索)
“`
User.includes(:skills).where(user_skills: { skill_id: 1 })
“`
※user_skillsは中間テーブル

## 多:多(作成)
“`
User.new(skills: [Skill.find(1)])
“`

元記事を表示

Railsでxml, html などMIMEタイプごとに返すViewを指定する

mime typeによって返すviewを変更する方法です。

例えばxml, htmlへのレスポンスを別々に作成する場合

“`ruby:UsersController.rb
class UsersController < ApplicationController def show @user = users.find(params[:id]) respond_to do |format| # HTMLのレスポンス format.html # XMLを使う場合のレスポンス format.xml     # 指定がない場合のレスポンス     format.any end ``` html, xml それぞれに対応したテンプレートは以下のパスに作成します。 `app/views/users/show.html.erb` `app/views/users/show.xml.erb` ### MIME TYPE種類 https://developer.mozilla.org/ja/docs/Web/HTTP

元記事を表示

M1MacでGemのmysql2でエラー

# 環境
ホストOS:MacOS12.3
CPU:M1
仮想環境:docker compose
ruby: 2.7.5p203
rails: 6.1
MySQL: 8.0

# エラーメッセージ
以下は主なエラーを抜粋したものです。

“`
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
“`

“`
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
“`

“`
ld: warning: directory not found for option ‘-L/usr/local/opt/openssl/lib’
“`

“`
ld: library not found for -lzstd
“`

エラーメッセージはerror,failed,not foundあたりが原因のことが多いですね。

# 解消するためにやったこと
### MySQLインストール
新しいPCでMySQ

元記事を表示

RailsアプリケーションでN+1問題を解決する

# N+1問題とは
N+1問題とは、1つのテーブルへのSQL発行+複数(N回)の関連テーブルへのSQL発行が発生している現象のことを示している。
つまり、データ量が増えるだけパフォーマンスが低下してしまう。また、大量のSQL発行でDBに高負荷をかけてしまう副次的な問題も発生してしまう。
###### 例えば、console上でSkillCategoryモデルから5つSkillの名前を取得してみると
“`ruby:ruby
Skill.limit(5).each do |skill|
p skill.skill_category.name
end
“`
###### 下のようにconsole上でSQL発行ログが出力される
“`sql:sql
Skill Load (0.4ms) SELECT “skills”.* FROM “skills” LIMIT ? [[“LIMIT”, 5]]
SkillCategory Load (0.2ms) SELECT “skill_categories”.* FROM “skill_categories” WHERE “skill_

元記事を表示

本日のRuby基礎練習問題(22/4/12)

# 問題
以下の要件を満たすsum_numberメソッドを実装しましょう。
第一仮引数をnとし、第二仮引数をmとすること
nからmまでの数を足し合わせていき、その総和を出力すること
(例:n=1,m=5の場合、総和は1+2+3+4+5=11)

↓雛形
“`ruby.rb
def sum_number(n, m)
# 処理を記述
end

# 呼び出し例
sum_number(1,10)
“`
出力例
sum_number(1,3) → 6 <計算内容:1+2+3>
sum_number(1,10) → 55 <計算内容:1+2+3+4…+10>
sum_number(5,15) → 110 <計算内容5+6+7+8…+15>
# 私の回答
“`ruby.rb
def sum_number(n, m)
total = 0
while n <= m total = total + n n = n + 1 end puts total end # 呼び出し例 sum_number(5,15) ``` # 解説 まず2行目に変数totalに0を代入

元記事を表示

Ruby 正規表現「先読み」

正規表現で「先読み」というものについて最近知ったので自分の言葉でまとめてみようと思う。

## Onigmoとは

Ruby2.0以降では[Onigmo](https://github.com/k-takata/Onigmo)という正規表現エンジンが使用されています。
Onigmoは[鬼車](https://github.com/kkos/oniguruma)のフォークバージョンであり、鬼車はRubyのバージョン1.9やバージョン5以降のPHPの正規表現エンジンとして採用されています。

## ?= 先読み Look-ahead

「先を読む」とはなんだろう。
「look ahead」には「先のことを考える」「将来に備える」という意味がある。

先読みの正規表現とは、“`A(?=B)“`のようにかき、以下のようにマッチします。

“`ruby:Ruby
p “When we look at global environmental issues, we have to look ahead to the future”.scan(/look (?=ahead)/)
#=>[“lo

元記事を表示

Railsのバージョンアップ時にCSRFトークンに悩まされた話

Railsを使用していると、普段何気なく運用しているCSRFという仕組み。
このCSRFについて、Railsのバージョンアップ時に苦戦した経緯がありましたのでシェアしたいと思います。
そもそもCSRFとは?という方については、下記に分かりやすく解説してくれている記事がありますのでそちらを参考にして頂ければと思います。
[RailsのCSRF対策について](https://qiita.com/eshow/items/915f8e8ad317aa8e49a6)

### Railsのバージョンによって生成されるCSRFトークンが異なる
今回のバージョンアップではRailsを6.1→7.0に上げたのですが、この旧バージョンと新バージョンで生成されるCSRFトークンが異なります。どのような違いかというと、旧バージョンでは通常のBase64でトークンがエンコードされるのに対し、新バージョンではURLセーフなBase64でエンコードするようになりました。
そしてこのトークンが異なる状態で、ページ遷移するとArgumentErrorを引き起こします。(この時は旧バージョンから新バージョン、新バージョ

元記事を表示

OTHERカテゴリの最新記事