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

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

class<

ruby書いているとタイトルのような記述を見たことがある人は多いとおもいます。自分はよくわからなかったので今回の記事でまとめてみようとおもいます。

こういう時はとりあえず公式ドキュメントを見てみようと思ったので見てみました。すると、
>特異クラス方式。複数のメソッドを一度に定義するとき向き
>https://docs.ruby-lang.org/ja/3.0/doc/spec=2fdef.html#class_method

## 特異メソッドとは?
特異メソッドとは1つのオブジェクトに対して適用されるメソッドのことです。実際に例を見ていきましょう

“`
class User
def my_name
puts “自己紹介しましょう”
end
end

ouki = User.new
riboku = User.new

def ouki.introduction
p “秦国最強の将軍である”
end

ouki.my_name
=> 自己紹介しましょう

riboku.my_name
=> 自己紹介しましょう

ouki.introduction
=> “

元記事を表示

【RSpec】raise_error, changeマッチャーを繋げて使いたい

## 例外を投げることを確認しつつ、値が変化することも確認したい

下記のようなクラスがあった時に、
`StandardError`を投げることと、`@num`の値が増えることを確認したい。

“`ruby:テスト対象のクラス
class TestTarget
attr_reader :num

def initialize
@num = 0
end

def call!
@num += 1
raise StandardError
end
end
“`

## 繋げない書き方

`raise_error`マッチャーで期待値を確認する**前後の行**で、値の変化を確認するとこうなる。

“`ruby
RSpec.describe ‘TestTarget#call!’ do
it ‘例外を投げ、@numの値が増える’ do
t = TestTarget.new

# expect { t.call! }.to change(t, :num).by(1) のように書きたいけど、
# 例外が発生するから確認できない

元記事を表示

N+1問題の直感的理解

#N+1問題
例えば、user(has_many :posts)なるテーブルと、post(belongs_to :user)なるテーブルの二つがあるとする。
userは0個以上のpostを持っていて、postには各userのid(user_id)が必ず対応している。
ここで、各userの持っているpostを取り出し、userの名前(user.name)と、postのタイトル(post.content)を全件表示したいとき、どのようなコードを書けばよいだろうか。

最も分かりやすいのは以下のコードだろう。

“`ruby:view
User.all.each do |user|
user.posts.each do |post|
puts “#{user.name} / #{post.title}”
end
end
“`
このコードで実行される内容は、

1. userの情報を取得するために、userテーブルにアクセス
2. id = 1のuserのpostの情報を取得するためにpostテーブルにアクセス
3. id = 2のuserのpostの情報を取得するためにp

元記事を表示

request.env[“HTTP_USER_AGENT”] について

request.env[“HTTP_USER_AGENT”] というのを実務で見かけてよくわからなかったのでまとめてみようとおもいます。

## 何ができるのか?
結論からいうと、これを使うことでどのブラウザからアクセスしているのか、どのデバイスからアクセスしているのかということがわかるんです。
例えば、
“`
request.env[“HTTP_USER_AGENT”].include? “Chrome”
“`
とすることでユーザーがchromeを使ってアクセスしているのか、ということがわかるんです。
また、
“`
request.env[“HTTP_USER_AGENT”].include? (‘Mobile’)
“`
とすることで、アクセスしているユーザーの端末はiOSなのかandroidなのかということが分かります。

MobileはiPhoneやiPadなどのapple製品で、androidはその名の通りandroid系です。

自分はまだ経験したことはないですが、OSやブラウザごとに処理を変えたい時に使うものなんだとおもいます。

以上です。何か間違いがございまし

元記事を表示

継承を使う際の注意点

# 概要

ソフトウェアエンジニアとして働き始めて早一年、それなりに大きなリポジトリのソースコードを扱ってきました。
様々なコードを読み書きする中で、とりあえず仕様を満たすコードを書くだけではなく、どのような設計・アーキテクチャにするかについて考え、勉強するようになりました。
この記事では、実務での経験を踏まえて**クラスの継承**を使う際の注意点について書いてみたいと思います。言語はRubyですが、他の言語を書いている方でも読めると思います。
※コードの内容は実際のものではなく、デフォルメしています。

# 想定読者
以下のような読者を想定しています。

– アプリケーションの設計やアーキテクチャに興味を持ち始めた人
– とりあえず仕様を満たす処理は書けるが、コードがすぐぐちゃぐちゃになってしまう人
– 個人で小さいアプリケーションを開発した経験はあるが、複数人で開発している比較的大きいアプリケーションには触れたことがない人
– プログラミング言語の基本的な文法は理解し、オブジェクト指向などを学んでいる人

# 家の情報を扱う
この記事ではサンプルとして、家(一戸建て)の情報を扱おう

元記事を表示

Ruby on Rails チュートリアル第12章をやってみて

#パスワードの再設定
■第12章
本章では、ここで生成したメイラーにリソースとデータモデルを追加して、パスワードの再設定を実現していく。

##12.1 PasswordResetsリソース
必要なデータをUserモデルに追加していく。11章では`edit`アクションのみだったが、今回はフォームが必要なので`new`アクションと`edit`アクションが必要。

###12.1.1 PasswordResetsコントローラ
パスワード設定用のコントローラを作成する。今回はビューも扱うため、`new`アクションと`edit`アクションも一緒に生成する。

“`rb
$ rails generate controller PasswordResets new edit –no-test-framework
“`

新しいパスワードを再設定するためのフォームと、Userモデル内のパスワードを変更するためのフォームが必要になるので、`new`、`create`、`edit`、`update`のルーティングも用意する。

以下のコードを追加。

“`rb:routes.rb
resour

元記事を表示

Ruby on Rails チュートリアル第11章をやってみて

#アカウントの有効化
■第11章
この章では、アカウントを有効化するステップを新規登録の途中に差し込むことで、本当にそのメールアドレスの持ち主なのかどうかを確認できるようにしてみる。

##11.1 AccountActivationsリソース
セッション機能 を使って、アカウントの有効化という作業を「リソース」としてモデル化する。

###11.1.1 AccountActivationsコントローラ
AccountActivationsコントローラを生成。

“`rb
$ rails generate controller AccountActivations
“`

ルーティングに`resources`行を追加。

“`rb:routes.rb
resources :account_activations, only: [:edit]
“`

###11.1.2 AccountActivationのデータモデル
ハッシュ化だったり、3つの属性が必要。

“`rb
$ rails generate migration add_activation_to_users \
>

元記事を表示

gem bullet による警告が消えても必ずログを確認する必要がある

初学者向けに書きました。
これはまだ自分が初学者だった頃のメモです。もはや何番煎じかわからない内容ですが、何か記事を書きたかったので書きました。
間違い等ありましたら申し訳ございません。ボコボコにコメントしてやってください。すぐ直します。

# 伝えたいこと
– bulletを使用していても検知されないN+1問題がある。
– bulletによる警告が出ていないからといって満足して終わらないように。ちゃんとチェックしよう。
– N+1問題が解決していても本当にそれが最適な処理になっているのか吟味しよう。

# bullet とは
– N+1問題を検知するgemです。詳しくは[公式](https://github.com/flyerhzm/bullet)で。

# 問題①:検知できないN+1問題
例えば、以下のコードはN+1問題を発生させますが、この問題はbulletでは検知できません。

“`ruby
class Post < ApplicationRecord has_many :comments end @posts = Post.preload(:comments)

元記事を表示

Ruby3.1.1のインストール(忘備録)

エラー内容を載せてなくてすみません。とりあえずの忘備録。

macOS Monterey(12.2.1)
CPUはIntel

“`
$ rbenv install -v 3.1.1
“`

がこける

以下やったこと

これをみると`binutils`が新しいといいらしい
https://github.com/rbenv/ruby-build/issues/1723

自分は入ってなかったので

“`
$ brew install binutils
“`

とした上で(binutils 2.37が入りました)pathを通す

.zshrcに

“`
export PATH=”/usr/local/opt/binutils/bin:$PATH”
“`

を書く

まだダメだった(opensslのビルドでだめ)のでopensslをHomebrewで入れてある`openssl@1.1`の方を使う
参考: https://qiita.com/mikan3rd/items/d1dfd7cb62cc23393dd9

“`
$ export RUBY_CONFIGURE_OPT

元記事を表示

Rubyでif文の戻り値を代入するときのコーディングスタイル、あなたはどっち!?

## はじめに
Rubyではif文の戻り値を変数に代入することができます。その場合、大きく分けて次のような2つのスタイルがあると思います。

“`ruby
# = と if を同じ行に書く
greeting = if japanese?
‘こんにちは’
else
‘Hello’
end
“`

“`ruby
# if を一段改行する
greeting =
if japanese?
‘こんにちは’
else
‘Hello’
end
“`

他にもこういうスタイルもあるかもしれませんが、あまり見かけないので、今回は除外します。

“`ruby
# 2行目以降はインデントさせない
greeting = if japanese?
‘こんにちは’
else
‘Hello’
end

# 2行目以降は1つだけインデント
greeting = if japanese?
‘こんにちは’
else
‘Hello’
end
“`

あと、「

元記事を表示

Excel 表記の変換 R1C1 から A1 へ / A1 から R1C1 へ

Excel 表記の変換方法です。
R1C1表記 から A1表記 へ、 そして A1表記 から R1C1表記 への変換ができます。

Codeforge の 1B がこれに似た問題です。 最近は Excel での作業もそこそこあり、 たまに使いたくなることがあります。

## 関数・定数定義

“`ruby
RC_PATTERN = /\AR(\d+)C(\d+)/
ABC_PATTERN = /\A([A-Z]+)(\d+)\z/

def cv_rc(value)
v = 0
for c in value.split(”)
v *= 26
v += (c.ord – ‘A’.ord + 1)
end
v
end

def cv_a(value)
(‘A’.ord + value – 1).chr
end

def cv_ab(value)
return ” if value == 0

cv_ab((value – 1) / 26) + cv_a((value – 1) % 26 + 1)

元記事を表示

Rails ToDoアプリ タスク管理アプリ (期限切れ・締め切り順・完了ボタン)

# はじめに
雑記事です。また時間を見つけてブラッシュアップいたします。

##完成図
![スクリーンショット 2022-02-19 6.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/f9517dd6-6b17-785d-7b13-1948c146b7a2.png)

・タスク一覧に残り期限が表示されている
・タスク一覧にタスクが期限順に並んでいる
・期限切れの未完了タスクの表示を変更している
・未完了タスクに完了ボタンが表示されている
・完了ボタンを押すと、完了したタスク一覧に完了日時が表示される

##前提
タスクの簡単なタイトル投稿が作成済みであること
Railsの基礎的な知識を身につけていること

##実装方法
まずタスクを保存する該当のテーブル(本記事ではtweetsテーブル)にタスクの期限を格納するtimeカラムと、タスクが完了した日を格納するdone_atカラムを追加する

### データベース

以下のコマンドでマイグレーションファイルを生成します。

元記事を表示

RustやElectron、denoに浮気しつつmrubyを使ってMacでクロスコンパイルしwindows用のexeを作るのに苦労した話

## きっかけ
[これ](https://qiita.com/kurokky/items/ca7598ca4a742bcbcdea)のローカル版を作りたいということで

– SVGをパースしてdom上の特定の要素を抽出
– dom上だけではなくinlineのCSSや

内のCSSから特定の要素を抜いてくる

たったこれだけ。
なので**xmlパーサー(XPathなら嬉しい)と正規表現は必須**、cssパーサーは元々の状態で使ってなかったのであれば良しとする。

因みにチャレンジしたフレームワークや言語は

– [Rust](https://www.rust-lang.org/ja)
– [Crystal Language](https://ja.crystal-lang.org/)
– [Electron](https://www.electronjs.org/)
– [deno](https://deno.land/)
– [ruby-packer](https://github.com/pmq20/ruby-packer)
– [mruby](https:

元記事を表示

Ignoring racc-1.5.2 because its extensions are not built. Try: gem pristine racc –version 1.5.2が出た時の対処法

## はじめに
こちら自分用のメモであるためとても雑な記事です。
ただ、同じようなエラーが出た人の助けに少しでもなれば幸いです。
## エラーログ
railsコマンドをターミナルで実行すると無限に以下のメッセージが吐き出される

![スクリーンショット 2022-02-19 2.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/5842c8d9-4536-f834-133e-3927a7a3c897.png)

“`.zsh

Ignoring racc-1.5.2 because its extensions are not built. Try: gem pristine racc –version 1.5.2
Ignoring racc-1.5.2 because its extensions are not built. Try: gem pristine racc –version 1.5.2
Ignoring racc-1.5.2 because its

元記事を表示

区間が重なるためのある条件式と `Range#overlaps?` の定義は同じなのか

Rails で定義されている [`Range#overlaps?`](https://api.rubyonrails.org/classes/Range.html#method-i-overlaps-3F) の[定義](https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/activesupport/lib/active_support/core_ext/range/overlaps.rb#L8)は

“`rb
def overlaps?(other)
cover?(other.first) || other.cover?(first)
end
“`

となっている。`other` と対比しやすいよう `self` を補うと

“`rb
self.cover?(other.first) || other.cover?(self.first)
“`

となる。

ところで、区間が重なっているか調べるには

“`rb
self.first <= other.end && oth

元記事を表示

【rbenv】`rbenv install 3.1.0`実行時の`BUILD FAILED`を解消した方法【Ruby】【Rails】

##`rbenv install 3.1.0`実行時の`BUILD FAILED`を解消した方法

### 状況
M1 macで以前にRuby 2.7.5をインストールしていました。
OSを11.6.4(Big Sur)から12.2.1(Monterey)にバージョンアップした後にRubyをバージョンアップするために、`rbenv install 3.1.0`を実行した際に、以下のエラーが出てインストールができませんでした。

“`:ターミナル
$ rbenv install 3.1.0
Downloading openssl-1.1.1l.tar.gz…
-> https://dqw8nmjcqpjn7.cloudfront.net/0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1
Installing openssl-1.1.1l…

BUILD FAILED (macOS 12.2.1 using ruby-build 20211227)

Inspect or clean up the w

元記事を表示

[Rails] FactoryBotの実装

# FactoryBot
FactoryBotはRailsでテストサンプルデータを簡単に扱えるように考えられたgem。
rspecと組み合わせて使われる例をよく見ます。

##使い方
###初期設定
“`ruby:spec/rails_helper.rb
config.include FactoryBot:Syntax::Methods # Rspec.configureの中に記述
“`

###Factoryの定義
“`ruby:spec/factories/ex.rb
FactoryBot.define do
factory :ex_user do
name {“user1”}
password {“password”}
end
end
“`
上記の例ではfactoryの名前がex_userでその中に名前とパスワードが格納されています。

###Specへ記述
“`ruby:specテスト内
example “xxxのテスト”
m = build(:ex_user)
end
“`
ex_userをspec内でbuildすることで、テスト内で使用

元記事を表示

RubyのGETリクエストを送る際にヘッダを指定する方法

## 背景
WEBサービスにLINE Loginを実装する際に、ヘッダを指定してGETリクエストを送るのにハマってしまったので、記載。httpartyを使えば、あっさりと書くことができた。

## 環境
– Ruby 2.6.2

## 実装
“`
# httparty.rb
require ‘httparty’

@res = HTTParty.get(“https://api.line.me/v2/profile”, :headers => {“Authorization” => “Bearer #{@response_body[‘access_token’]}”})
“`
## 参考
https://developers.line.biz/ja/docs/line-login/managing-users/#get-profile
https://gist.github.com/jeffdonthemic/99c4da9daba9a4ee36ba

元記事を表示

[備忘録]ActiveAdminで子モデルの要素を引っ張ってくる記述方法

どうも。

受託開発で管理画面の開発をバリバリやっていたとき詰まったところを書いていく

activeadminで子モデルを参照するとき、
・permit_params
・filter
・index/show
・inputs
で書き方が異なる

##今回使うモデル例
“`user.rb
has_one :profile
has_many :items
“`

“`profile.rb
belongs_to :user
“`

“`item.rb
belongs_to :user
“`

“`schema.rb
ActiveRecord::Schema.define(version: 2022_XX_XX_XXXXXX) do
create_table “users”, force: :cascade do |t|
t.string “username”
t.datetime “created_at”
t.datetime “updated_at”
end

create_table “profiles”, force: :cascade do |t|

元記事を表示

Ruby on Rails チュートリアル第10章をやってみて

#ユーザーの更新・表示・削除
■第10章
`edit`、`update`、`index`、`destroy`アクションを加え、RESTアクションを完成させる。まず、ユーザーが自分のプロフィールを自分で更新できるようにできる。

##10.1 ユーザーを更新する
ユーザー情報を編集するパターンは、新規ユーザーの作成と似てるらしい。

###10.1.1 編集フォーム
Usersコントローラに`edit`アクションを追加して、それに対応するeditビューを実装する。

“`ruby:users_controller.rb
def edit
@user = User.find(params[:id])
end
“`

editビューも作成。

“`ruby:edit.html.erb
<% provide(:title, "Edit user") %>

Update your profile

<%= form_for(@use

元記事を表示

OTHERカテゴリの最新記事