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

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

【Rails】Modelに定義した定数をControllerやViewで使用する方法

## はじめに
どうも、もきおです。RailsでModelに定義した定数をControllerやViewで使用する場面が実務でちょくちょく使う事があり、どうやって参照するんだっけ?と思ったので、調べたのをメモとして残しておきたいと思います。

## 結論
定数を参照するには**Model名(Rubyならクラス名)::定数名**で参照する事ができます。
“`ruby:
MAIN_USERS = [“Bob”, “Keny”, “John”, “July”, “Karen”].freeze

User::MAIN_USERS
# => [“Bob”, “Keny”, “John”, “July”, “Karen”]
“`
## 具体例
さて、具体例に入っていきましょう。今回はユーザー登録の際、SNSのURLを入力する欄があるとします。その際、省きたいURLを予め定数として登録しておき、実際入力され渡ってきたURLと定義していた定数が部分一致する場合、バリデーションでアラートを表示するというパターンで記述したいと思います。

まずは良く使うものをmodelに定数定義しましょう。“.fr

元記事を表示

Rubyを使ってメール通知をしたいだけなのにどハマりした結果

# はじめに

新しくサーバーを構築して、自作Webアプリケーションにメール通知機能を追加したいと思い、簡単にできるだろうと考えていたらハマりました。

# 環境

Ubuntu 22.x.x
Ruby 3.0.x
Postfix 3.6.x

# ソースコード

“`rb:mailtest.rb
#!/usr/bin/env ruby

require ‘mail’

mail = Mail.new do
from “xxxx@xxxx.com”
to “yyyy@yyyy.com”
subject “test mail”
body “this is a test mail.”
end

mail.delivery_method(:smtp,
address: “localhost”,
port: 25,
domain: “localdomain”,
)

mail.deliver
“`

# エラーメッセージ

“`
$ ./mailtest.rb
/usr/lib/ruby/3.0.0/net/smtp.rb:101

元記事を表示

Slack Bot アプリを作成しよう

[rack Gem](https://github.com/rack/rack) について勉強した時にBot アプリを作成したので、そのメモとして残そうと思います。:bow:
もしBot アプリを作成してみたいという方がいれば参考程度にしてみてください。

### どういうアプリ?
Slack のチャットフォームの方で`@botユーザー say_hello` と入力すると、@botユーザー が挨拶してくれるアプリです。

![スクリーンショット 2022-08-22 17.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2290550/98d6f592-a75f-2072-08b6-de92372e8083.png)

## 準備
#### Slack token 取得する

(1) https://slack.com/services/new/bot にアクセスする
(2) ユーザー名を記入し`ボットインテグレーション`からボットユーザーを作成する

ex. (私は`bot-app` の名前

元記事を表示

【Ruby】メソッドの後の感嘆符”!”について

メソッドの中には、破壊的にデータを変更してしまうものがあり、慣習として名前に”!”が付けられます。

例えば、以下のコードがあったとします。
“`
self.email = self.email.downcase
“`
参考:Railsチュートリアル 第4版 6章より
https://railstutorial.jp/chapters/modeling_users?version=5.0#sec-minimum_password_standards

上記だと右辺で”self.email”を全て小文字にしてから自身に代入することで更新していますが、
.downcase!メソッドを用いることで、直接”self.email”の値を変更することができ、より簡潔に書けます。

“`
self.email.downcase!
“`

破壊的なメソッドは便利そうですが、一方で元の値を強制的に上書きするので、使いどころには注意ですね。

【追記2022/08/26】
@nodai2h_ITC 様よりご指摘を頂きました。
以前、”!”をメソッドに付けると破壊的なメソッドになると勘違いしていまし

元記事を表示

Ruby 2.7まで動いていたデフォルト値付きのブロックパラメータをRuby 3.0向けに書き替える

## はじめに:Ruby 2.7では動いていた奇妙なコード
とあるRailsプロジェクトをメンテしていたら、こんな奇妙なコードに遭遇しました。

“`ruby
def sample
data = {
a: nil,
b: { x: 1, y: 2 },
c: { x: 1 },
d: { y: 2 },
}
data.map do |k, x: 0, y: 0|
[k, x, y]
end
end
“`

Ruby 2.7でこの`sample`メソッドを実行すると以下のような結果が得られます。

“`ruby
# Ruby 2.7
sample
#=> [
# [:a, 0, 0],
# [:b, 1, 2],
# [:c, 1, 0],
# [:d, 0, 2],
# ]
“`

## これはいったい何をやってるの?

このメソッドでは以下の行で`x`や`y`のデフォルト値を設定しています。

“`ruby
data.map do |k, x: 0, y: 0|
“`

元記事を表示

Capybara内部のリトライ間隔をのばしてCPU節約

## 背景
Railsで作ったGUIのアプリをブラウザ自動化テストする際、CI環境のCPU使用率が高いことが気になっていました。複数のテストが並行した場合に、不安定になってどれか失敗してしまうということも起きました(※CPU使用率との因果関係は不明ですが)。

テストは RSpec + Capybara + Selenium + Headless Chrome で作ってあります。chromeの起動オプションでCPU使用率を節約できるものがないか調べたりしたのですが、効果のあるものは見つけられませんでした。

色々探していたら、CapybaraにもCPU使用率が上がってしまう要因があることを知りました。

https://zenn.dev/megeton/articles/f73dc1a0db69b7

> **待っているとPCのファンが唸りを上げてしまう原因と対策**
>
> 次のように書くと内部では 0.01 のウェイトが入っているため処理回数は1秒間で約100回、全体で約6000回になる
>
> “`ruby
> Capybara.has_selector?(…,

元記事を表示

Ubuntu (WSL) に asdf をインストールして Ruby と Crystal をそれぞれ複数バージョンインストール

# asdf とは

プログラミング言語などのバージョンを管理するツールです。
Ruby なら rbenv が有名ですが、asdf は様々なプログラミング言語やツールについて複数のバージョンを自在に切り替えながら使うことを可能にしてくれます。

https://asdf-vm.com/

# なぜ asdf を使いたいのか

「複数の言語を」「単一のしくみ」でバージョン管理できる点が嬉しいです。

私は Ruby と Crystal を使って競技プログラミングをやっているのですが、コンテストでは必ずしも各言語の最新バージョンを使えるわけではありません。かつ、ときどきコンテストサイトで言語アップデートがあってバージョンが変わるのに追随する必要があります。
また、使っている言語の最新バージョンが出るとやっぱりさわってみたくなったりもします。

asdf なら、Ruby も Crystal も(新しく増えたらその言語も)同じしくみで、コンテスト用のバージョンから最新バージョンまで簡単に切り替えながら使えていろいろ捗ります。

# 環境、前提条件など

Ubuntu 20.04.4 LTS (

元記事を表示

formオブジェクト使用時のエラーメッセージの日本語化

# 概要

エラーメッセージの日本語化を実装したが、formオブジェクトを使用している箇所だけ実装できない。

# 前提
ja.ymlファイルの作成までは完了している。
Formオブジェクト以外のエラーメッセージについては日本語化ができている。

# 現状
ja.ymlに日本語入力の記述をしても日本語にならない

“`
ja:
activerecord:
attributes:
user:
name: ニックネーム
birthday: 誕生日
family_name: 姓
first_name: 名
family_name_kana: 姓(カタカナ)
first_name_kana: 名(カタカナ)

item:
item_name: 商品名
image: 商品画像
introduction: 商品の説明
price: 価格
delivery_days_id: 配

元記事を表示

IntelliJ 2022 以降では Gemfile に RuboCop が無いと使えない

# IntelliJ の RuboCop 統合機能
IntelliJ には RuboCop との統合機能があり、 RuboCop 的にまずい部分をコードエディタ上にハイライトで表示してくれる。
https://pleiades.io/help/idea/robocop.html
> IntelliJ IDEA は RuboCop(英語) との統合をサポートしており、コードエディターなどで IDE 内でその違反を直すことができます。

IntelliJ 2021 までは、RuboCop が対象プロジェクトの Gemfile に記載されていなくても使用できたのだが、
IntelliJ 2022.1 くらいから、 Gemfile に記載していないと使用できなくなった。

# なんで使えなくなったの?
このあたりの経緯は YouTrack のこの issue を見るとなんとなくわかる。
[Rubocop should run on `bundler exec` if available](https://youtrack.jetbrains.com/issue/RUBY-26915/Ruboc

元記事を表示

bundle cacheあるいはbundle package

https://bundler.io/v2.3/man/bundle-cache.1.html

について。かつては、bundle packageという名称であったし、ドキュメントも https://bundler.io/v2.0/man/bundle-package.1.html に残されている(当該Bundlerバージョンは既にdeprecated=メンテナンスされていない)。両者はほぼ同じことを実現するため、Bundler 2.1くらいに完全に統合された。し、2.3中盤ではそれが[rubygems/rubygems#5785](https://github.com/rubygems/rubygems/pull/5785)において少しだけ分かりやすくされた。

私自身はこれまでほぼ使う場面がなかったのにドキュメントをメンテナンスすることになったしメンテナンスしているのだが、どういう場合に活用するのだろう。活用ケースによって、どちらのサブコマンド名が一般的なのか分かるのかもしれないので、質問してみたい。

例えば、`npm ci` https://docs.npmjs.com/cli

元記事を表示

【Ruby】Railsでリクエストのバリデーションを行うライブラリ`rails_param`

## 概要
Railsでリクエストのバリデーションを行う場合、[Rails基礎 ストロングパラメータとバリデーション](https://hpsuzucat.hatenablog.com/entry/2020/10/24/224143)の記事にある通り、ApplicationRecordの機能を使用する方法などが挙げられます。もちろん、この方法でも全然良いのですが、ApplicationRecordのモデルに通す前に、controllerでバリデーションしたい時もあるなと感じました。
何かないかなと調べてみた結果、`rails_param`というライブラリが良さげだったので、今回少し紹介します。

## 機能など
[nicolasblanco/rails_param](https://github.com/nicolasblanco/rails_param)に、ライブラリのReadmeがあります。パラメータの、型指定や、必須チェック、最小値・最大値など基本的なチェックは出来そうです。また、項目毎にエラーのメッセージもカスタムで設定できます。

## 実装サンプル
以下はAPIで、文字列の

元記事を表示

Ruby on rails JqueryとBootstrapが反映されない

今日は、RailsのTutorialsでJqueryとBootstrapをインストールした後、Dropdownの反映がされなかったので、その対処法についてまとめました。

まずは、こちらのコードを実行しました。
~~~app/javascript/packs/application.js
//= require jquery
//= require bootstrap
~~~

そして、
~~~app/assets/stylesheets/custome.scss
@import “bootstrap”;
~~~
を追加しました。
しかし、これでは動かず、、

~~~app/layouts/application.html.erb