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

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

アクティブストレージを利用して複数枚の画像を投稿した際の単体テスト

アクティブストレージを利用して複数枚の画像投稿には成功した。
しかしテストコードで詰まったので記録。
結論
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.images = [ fixture_file_upload(“/files/test_image.jpg”)]
end
“`
このように書き換える。
画像1枚のときは fixture_file_uploadだけでよかったのですが、複数枚になったことで配列で渡す必要があったのですね。

元記事を表示

エラーメッセージを日本語対応にする

フリマアプリ追加実装にてエラーメッセージを日本語対応にしたので記録。
まずは
config/application.rb
“`ruby
config.i18n.default_locale = :ja
“`
を追記。これしないとエラーでます。

“`ruby
gem ‘rails-i18n’
“`
をgemファイル末尾に加えてbundle install(ローカル)
itemモデルのimageのところを
“`ruby
has_many_attached :images
“`
このようにhas_many_attachedに変える。image→imagesの複数形にすることも注意。
次にitemsコントローラー。
ストロングパラメーターを書き換える。
“`ruby
def item_params
params.require(:item).permit(:product_name,:product_description,:category_id,:condition_id,:contribution_id,:prefecture_id,:delivery_id,

元記事を表示

ブロック、コールバックの使い方の一例

>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼

皆さん、ブロック(コールバックメソッド)は使用されてますでしょうか?
自分は今日まで使ったことがありませんでした。?

どうも使いどころが分からないんですよね~
しかし、やっと使いどころが1つ明らかになりましたので共有させて頂きます。

## はじめに
本記事は以下の読者様が対象です。

* プログラミング初心者

* コールバックメソッド(ブロック)について知りたい

本記事ではRubyを題材に例題コードを作成しているため、コールバックではなくブロックと呼称させて頂きます。

## 先に結論
* ブロックを使うことで複数のメソッドをつなぎ合わせることができる。
* メソッドを拡張する際によりブロックを使えば、抽象的な名前に変更しなくてよくなる。

## 背景
私はオリジナルのスクレイピングコードを書いており、
以下のような自作メソッドを定義しておりました。

このメソッドはスクレイ

[Ruby]関数を作成する上で心がけること

## ラベル付き引数

* 引数名がはっきりしているので渡す内容がわかりやすい。
* rubymineのIDEなどで自動保管してくれる
* 渡し忘れの引数があればエラーが出る
* デフォルト値も指定できるのでデフォルト値指定した分は省力できる
* 引数の順番気にしなくていい

“`
# 定義
def some_method(user: , require: false)
end

# 呼び出し型
some_method(
user: current_user
)
some_method(
user: current_user,
require: true
)
“`

## 普通の引数

* rubymineのIDEなどで引数名は把握できる
* 渡し忘れの引数があればエラーが出る
* デフォルト値も指定できるのでデフォルト値指定した分は省力できる
* 引数の順番を気にしなくてはいけないので数が多いと面倒
* 1・2個の引数でメソッド名からもわかりやすければ楽
* User.find(1) / User.find_by(id: 1) 左が楽

“`
def

【Rails6】終了日のバリデーションはValidatorが使える

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
終了日が開始日より先にならないようにバリデーションをかけたい。
開始日は必須パラメータで、終了日はオプション。

## before

“`ruby
class Period
attr_reader :start_date, :end_date

def initialize(start_date, end_date)
@start_date = start_date
@end_date = end_date
end

def validate_finish_contract_date!
return nil if end_date.blank?

raise ActionController::BadRequest, ‘不正な終了日です’ if end_date.to_date < start_date.to_date end_date.to_date end end ``` ## after 別クラスに切り出さな

【エラー解決方法(Rails API)】 406 Not Acceptable,…is missing a template for this request format and variant

# 概要
Rails7とReactでjbuilderを使用して値を返した際に出力された406エラーを解決するための記事です。

### エラー内容
“` docker
api_1 | Completed 406 Not Acceptable in 24ms (ActiveRecord: 5.6ms | Allocations: 1086)
api_1 |
api_1 |
api_1 |
api_1 | ActionController::UnknownFormat (Api::V1::PostsController#index is missing a template for this request format and variant.
api_1 |
api_1 | request.formats: [“text/html”]
api_1 | request.variant: []):
api_1 |
“`
### ソースコード
“`posts_controller.rb
module Api
modu

Action Cable+ReactでWebSocketのアプリケーションを0から作る

RailsのAction CableとReactの組み合わせでWebSocketのアプリケーションを0から作ってローカルで動作させました。

この記事では下記のチャットアプリの作った手順を紹介します。
下記の動画では、上下のブラウザでwebsocketでチャットしています。

![ezgif-1-7afa5d7957.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/43644227-8722-339f-9a7b-c99478de698f.gif)

# 主要ライブラリなどのバージョン

フロントエンドはReact、バックエンドはRailsを使っています。
主要なライブラリのバージョンは下記の通り。

## バックエンド

| ライブラリ | バージョン |
|:———–|:———–:|
| Ruby | 3.1.2 |
| Rails | 7.0.4 |
| Redis | 7.0.5 |
| Re

久々にRubyでスクレイピングをしてみよう

## 概要
一時期呼吸するようにスクレイピングをしていたのですが、最近しておらず職場で少々それ関係の話題になったのであらためてここに簡単なものを残しておこうと思う。

## 環境
ruby 3.1.2

## 準備
rubyなのでGemfileを定義します。

Gemfile
“`ruby
source ‘https://rubygems.org’

gem ‘nokogiri’
“`
HTMLのパースのためにnokogiriを使うのでこれだけ用意します。
ほかは標準で入っているものでjsonのパースとかしてくれる(強い)

作業ディレクトリで下記のコマンドを実行
“`sh
bundle install –path .bundle
“`
ただのbundle installだとグローバルに入っちゃったりするので、パス指定しておくほうがおすすめです。

## 実装

では、結論から
“`ruby
require ‘net/http’
require ‘uri’
require ‘nokogiri’
require ‘kconv’
require ‘json’
require ‘

Rubyで参照渡しができなくても悲観する必要はなかった

## 環境
Ruby2.6

## はじめに
自分が以前使っていたVBでは、関数での引数の受け渡しには、デフォルトではByValが指定されており、値渡しが基本であった。しかし、引数のパラメータに、ByRefを設定することで、参照渡しができるようになっていた。しかし、Rubyではどうも、参照渡しがそもそもできない仕様になっている。「うーん、これができないのか、使えんなー。」という印象であったが、Rubyには参照渡しができない代わりに、戻り値が複数選択できるようになっていた。思い直した。「なるほど、これはいいかも知れない。」このような仕様になっているのであれば、引数による参照渡しは確かに不要であった。戻り値を複数選択した場合、どのような動きになるのか、確認してみた。

## 動作確認
普通に、戻り値を1つだけ指定する場合です。戻り値でよく使われる、Boolean型を戻り値にしています。メソッド内の処理が正常終了したか、異常終了したか(更新処理で失敗して例外に飛んだなど)を判断するときによく使われるかと思います。
“`test.rb
def test_return?(a)
if

画像投稿機能を改善する(プレビュー機能をつけよう)

完成した某フリマアプリに画像投稿機能の改善をしました。
プレビュー機能と、実際に見た時に画像のサイズがバラバラだったので、画像サイズを統一できるように設定しました。
“`javascript
document.addEventListener(‘DOMContentLoaded’, function(){

const itemForm = document.getElementById(‘new_item’);

const previewList = document.getElementById(‘previews’);

if (!itemForm) return null;

const fileField = document.querySelector(‘input[type=”file”][name=”item[image]”]’);

fileField.addEventListener(‘change’, function(e){

const alreadyPreview = document.querySelector(‘

チェックボックスタグ機能の補足と、ページネーションを付けた場合のエラー解決

# はじめに
この記事はチェックボックスタグ機能を付けている前提で進めています。まだつけていない方は以下の記事を参考に、実装してみて下さい。
[【タグ機能完全版】 ~ Rails](https://qiita.com/MandoNarin/items/5a5610a40c66f77d6c10)

目次
1.補足(一覧ページに投稿したタグを表示する方法)
2.ページネーションを付けている場合のエラー解決

それでは、始めていきましょう。

# 1.補足(一覧ページに投稿したタグを表示する方法)
index.html.erb のeach文の中に以下の記述を追加してください。
“`erb:index.html.erb
<% @tweets.each do |t| %>
#以下を追記
<% t.tags.each do |tag| %>
<%= tag.name %>
<% end %>
#ここまで
<% end %>
“`
このように追加すれば、一覧ページに投稿したタグが表示されるはずです。もし表示されない場合やエラーが出る場合はアソシエーションやコントローラ

古くなってしまったrubocopを最新まで一気に上げたい人へ贈るバージョンアップの向き合い方

rubocopは定期的に新バージョンがリリースされていますが、最新もしくはそれに近いバージョンにきっちり保てているプロジェクトは案外少ないのではないでしょうか。
[2023年の3月末でRuby2.7のサポートが終了](https://endoflife.date/ruby)するのですが、3.0移行のrubyでrubocopを動かすにはrubocopのバージョンを1.0.0以上にあげる必要があります。
上記の都合から慌ててrubocopのバージョンを上げる必要になった方もいると思います。
しかし、一気に全部やろうとすると、チーム開発であれば他のメンバーの開発とコンフリクトしますし、長時間対応している間に新しいバージョンが出て規則が追加されるので全部対応しきるのは難しいです。
この記事では、そんなrubocopで疲弊する未来が見えた読者の方へ愚直に向き合いすぎないrubocopのバージョンアップ方法を授けます。

## とりあえずバージョンを上げる
まず兎にも角にもバージョンを上げるのが大事です。
そこでまずはrubocopのバージョンを上げてしまいましょう。
環境によってGemfileに

benchmark_driver 0.16.0 でワンライナー可能に

Ruby のベンチマークテストツール [benchmark_driver](https://github.com/benchmark-driver/benchmark-driver) のバージョンが 0.16.0 に上がった。

新機能の一つは,ワンライナーでの実行(「インライン Ruby スクリプトのベンチマーキング」)。

短いスクリプトならいちいちファイルを作らなくてもベンチマークテストができる。

ではこれを使って,`CGI.escapeHTML` による HTML エスケープを以下の Ruby バージョンで比較してみよう。

* Ruby 3.1.2
* Ruby 3.2.0-preview2
* Ruby 3.2.0-preview2(YJIT)

rbenv で Ruby をインストールしている場合は,`–rbenv` オプションによって複数の Ruby での比較ができる。オプションの値は以下のように書く。

“`
3.1.2;3.2.0-preview2;3.2.0-preview2 –yjit
“`

つまり,複数の Ruby バージョンを `;` で区切る。

Capistranoを使って自動デプロイする

某フリマアプリを作成した際、AWSのEC2を利用して自動デプロイするとき、ものすごく手間がかかったので備忘録。
詰まったところをかいつまんで載せる。
まず
“`ruby
adapter: mysql2
database: (アプリ名)_production
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
“`
をconfig/database.ymlに記載するわけですが、この記載場所は、
プロダクションのところに記述します。
例えば、
“`ruby
production:
<<: *default adapter: mysql2 database: furima-(番号)_production username: root password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
“`
といった感じに。

次につま

Ruby 麻雀の配牌を作成する

RUbyで麻雀アプリを作成するために勉強中

まずは簡単なところから作成します。
麻雀牌34種136枚から14枚をランダムに抜き取って表示します。

# コード紹介

“`Ruby:majons_controller.rb
class MajonsController < ApplicationController def index majon_pais = ["m1", "m1", "m1", "m1", "m2", "m2", "m2", "m2", "m3", "m3", "m3", "m3", "m4", "m4", "m4", "m4", "m5", "m5", "m5", "m5", "m6", "m6", "m6", "m6", "m7", "m7", "m7", "m7", "m8", "m8", "m8", "m8", "m9", "m9", "m9", "m9", "p1", "p1", "p1", "p1", "p2", "p2", "p2", "p2", "p3", "p3", "p3", "p3", "p4", "p4", "p4"

gem `puma`を6.0にアップグレードすると`capybara` の初期化で`NoMethodError: undefined method `strings’ for Puma::Events:Class`エラーが発生する問題の対処法

# 結論

`puma`を`6.0`以上で動作する場合`capybara`は`3.38.0`以上のバージョンが必要です

# 詳細

#### 1. 元々`puma`の実装で`Puma::Events`クラスは以下の2つの異なる責務を担っており責務過多だった

– ロギング
– コールバックイベントの管理

#### 2. 上記の2つをそれぞれの`class`に分離するBreaking changeが入るリファクタリングを行い`6.0`でリリース

https://github.com/puma/puma/pull/2798

#### 3. `capybara`で“Puma::Events`を参照していたが上記の変更の影響を受けてエラーが発生

“`ruby
Failure/Error: events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio

NoMethodError:
undefined method `strings’ for Puma::Ev

rails db:resetした時にActiveRecord::MismatchedForeignKeyと出た際の解決法

## 環境
– Ruby3系
– Rails7系
– MySQL
(SQLiteからMySQLにDBを変更しようとした際にエラーが発生した)

## エラー内容
“`terminal:terminal
rails db:reset
と実行したら↓

ActiveRecord::MismatchedForeignKey:
↑エラーが発生した
“`

## 解決法
“`terminal:terminal
rails db:migrate:reset
“`
を実行すれば、ActiveRecord::MismatchedForeignKeyが出ずに正常に動作します✅

## 原因
“`rails db:reset“`は、
1. 全テーブルdrop
1. schema.rbを元にDBを作成

します。
なので、**reference先が作られていないのに、任意のテーブルのreferenceカラムが先に作成されて、今回のエラーが発生します!**

そして、、、

“`rails db:migrate:reset“`は、
1. 全テーブルをdrop
1. migrationファ

Thang Nâng Hàng Bảo An

Thang nâng hàng Bảo An![thang-nang-hang-bao-1000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955385/5b8646c5-f3ce-0117-ce3b-efe5ce6ef078.jpeg)
là thương hiệu được hình thành và phát triển từ những năm 2008. Ban đầu chúng tôi cung cấp thiết bị nâng hạ như tời kéo, palang phục vụ các công trình công nghiệp phục vụ cho các nhà máy, xí nghiệp, thủy điện.
Liên hệ :
Địa chỉ:Số 356 Phan Trọng Tuệ – Thanh Trì – Hà Nội
Số điện thoại:0976292002
Email: thangnanghangbaoanh@gmail.com

Wordle攻略用のアプリケーションをruby.wasmで作りつつ貢献した話

Wordleという、いくつかのヒントをもとに5文字の英単語を当てるゲームがあります。

https://www.nytimes.com/games/wordle/index.html

ヒントには次のような物があります。
– 正解の単語に含まれない文字
– 正解の単語に含まれる文字
– 正解の単語に含まれて、位置が一致した文字

これらの情報を元に英単語の辞書から候補となる単語を検索するアプリケーションを作りました。
次にスクリーンショットを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/3750ba53-4c2f-5f3a-465b-88e053def98a.png)

上から

– 正解の単語に含まれない文字
– 正解の単語に含まれる文字
– 正解の単語に含まれて、位置が一致した文字

を入力して検索すると、候補になる文字列を表示します。
このアプリケーションは辞書を検索するだけです。
辞書も5文字の英単語に限定されているので、せいぜい4500語です。
ブラ

【Rails】params周りの理解を深める回〜”param is missing or the value is empty”へのアプローチ法〜

Railsのparams周りのエラーについて。
とある情報を保存しようとしたときに出てしまったので残す。

エラー文

![スクリーンショット 2022-11-05 13.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059549/ce21ac0d-a192-5bc3-6234-d477c05cbb5e.png)

paramsが存在していない、または空であるという意味らしい。

問題となっているファイルのコード

“`ruby:memory_submits_controller.rb
class MemorySubmitsController < ApplicationController def index @memorys = MemorySubmit.all end def new @memory = MemorySubmit.new end def create memory = MemoryS