Rails関連のことを調べてみた2023年02月05日

Rails関連のことを調べてみた2023年02月05日

【Rails×MySQL】utf8mb4対応でよく書かれている”encoding”と”charset”の、それぞれの役割について調べた→charsetが使われている場所が無かった

rails×MySQLについて、”rails utf8mb4″とかで検索すると、ほとんどの記事でdatabase.ymlにencodingとcharsetを両方書いています。

“`database.yml
# … 略
encoding: utf8mb4
charset: utf8mb4
# … 略
“`

encodingとcharsetは同じ値を設定していますが、それぞれの役割が分からないので、動作検証とソース確認をしてみました。

## 結論
・charsetはどこにも使われていない(ように見える)
・encodingはデータベースおよびシステム変数のcharset関連に適用される(結果としてテーブル・カラムも同様のcharsetになる)

## 検証環境
Rails: 7.0.4.2
MySQL: 8.0.32
mysql2: 0.5.5

## そもそもMySQLでCharset指定できる箇所
MySQLでCharset関連の指定ができる箇所は、以下の4つがあるかと思います。
1. データベース
(例:create database test_database

元記事を表示

Railway.appのメモリ使用量を減らすためにやったこと

Railway.appはherokuの代替として注目されたPaaSで(枕言葉)、自分もfly.ioのVMでは重くて難しい処理をRailway.appの方に任せるという方法で無償運用している。

やってるのは数時間に一回、Redisを伴ったSidekiq/schedulerのワーカーを回してるだけで、回してるワーカー自体の負荷は毎回数分ということもあって大した負荷はないのだが、Railsを回してるだけでも結構メモリを喰ってしまう。5ドルを超えると有償になってしまうというのもあるので、なるべくこのメモリ使用量を減らしたい。そんなわけでいろいろやったことをつらつら。

## MALLOC_ARENA_MAX=2
環境変数でMALLOC_ARENA_MAX = 2に指定しろというやつ。本当に意味があるかは正直不明。体感あるほど変わった印象はない。ちなみにherokuでは自動で2として設定されるらしい。

## Webなど不必要なviewやコントローラーなど全部destroyして消した
これはかなり効果があった。一応動作テストで作ってたviewなどがあったため、自分の場合はwebは全てfly.i

元記事を表示

【Rails/Heroku】「`write’: No such file or directory @ rb_sysopen – tmp/pids/server.」または、用意したのにYour app does not include a heroku.yml に陥った時

## やりたいこと
– GithubのRepoのmainブランチにマージされたら、Herokuにデプロイされて欲しい
– Docker上で動かしているので、ビルドなどもしてほしい

## 起こったことと対応
公式によると、heroku.ymlを用意する必要があるとのことだったので、サンプル通りに用意しました。

“`yaml:heroku.yml
build:
docker:
web: Dockerfile
run:
web: bundle exec puma -C config/puma.rb
“`

heroku.yml を使用して Docker イメージをビルドする | Heroku Dev Center
https://devcenter.heroku.com/ja/articles/build-docker-images-heroku-yml

これでOKと思ってデプロイしたところ、

“`
/usr/local/bundle/gems/puma-5.6.5/lib/puma/launcher.rb:259:in
`write’: No such f

元記事を表示

Dart Sass + cssbundling-rails から dartsass-rails に移行した

## はじめに

以前書いた記事で、 Webpacker から importmap-rails + Propshaft + cssbundling-rails への移行で実施したことを紹介した。

https://qiita.com/mishina2228/items/d4b9af22d0096ee451d7

このときは [Dart Sass](https://github.com/sass/dart-sass) を使っていたため、 Node.js が必要な状態だったが、 dartsass-rails はバイナリファイルをラップしているため、これを使えば `package.json` を使った JavaScript パッケージのバージョン管理や、肥大化する node_module ディレクトリから解放されるかも!と思い移行してみた。

https://github.com/rails/dartsass-rails

https://techracho.bpsinc.jp/hachi8833/2022_03_02/116014

**しかし、結論から言うと相変わらず Node.js は

元記事を表示

開発中のDeviseをインストールしてRails 7.0 (Hotwire/Turbo)のテストに協力する

## はじめに
Rails 7.0が2021年の暮れにリリースされて以降、Deviseは長らくRails 7.0(というか、Hotwire/Turbo)に完全対応していない状態が続いていました。ですが、ようやくDeviseのコミッタさんがRails 7.0対応に向けたプルリクエストを作ってくれました。

https://github.com/heartcombo/devise/pull/5548/

2023年2月4日現在、このプルリクエストの変更内容をテストしてくれるボランティアを募集しているようです。

もし、rails/ujsではなく、Hotwire/Turboを使っているRails 7.0にDeviseを組み込んでいる(もしくはこれから組み込もうとしている)人は、以下の手順に従って開発中のDeviseをテストしてみてください。

### 参考:僕もテストしてみた

ちなみに僕も動作確認用の簡単なRailsアプリを作って動作確認しました。

https://git

元記事を表示

Ruby if, else問題

# if文を使った条件分岐
以下の条件を満たすようプログラムを作成する。

– 条件1:第一引数のnumが1以上かつ10以下の範囲であればTrueを出力すること
– 条件2:第二引数のoutside_modeがTrueの場合は、第一引数numが条件範囲外でもTrueを出力すること
– 条件3:それ以外はFalseを出力すること

“`ruby
def in1to10(num, outside_mode)
if (num >= 1 && num <= 10) || outside_mode puts "True" else puts "False" end end # 呼び出し例 in1to10(5,false) in1to10(11,false) in1to10(11,true) ``` ```ruby True False True # ターミナル出力 ``` 複数の条件がある場合は、***論理演算子***を使って記述を行います。 ## 論理演算子とは 「真(true)」と「偽(false)」の確認を行う時に使われる演算子(記号)をのこと。 複数の条

元記事を表示

[Rails] コメント機能実装

# はじめに
コメント機能を実装するための忘備録です。
Userモデル、Articleモデル(Postモデルと同じ)は作成済みで行っています。
# 実行環境
– Rails 7.0.4.1
– Ruby 3.0.4
– Devise 4.8.1

# 実装
### 1. アソシエーション
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118527/42b97f6f-d233-1379-c1f6-ceeef6e8826c.png)
articlesテーブルとcommentsテーブルを1対多でつなぎ、comment_contentのレコードを追加していくだけでコメントを残すことは出来そうですが、
今回は、***誰がコメントを追加したか***まで実装したいため、articlesテーブルだけでなく、usersテーブルもcommentsテーブルにつなげます。

この場合、usersテーブルとariticlesテーブルは***多対多***の関係になっており、commentsテーブルはそれを実現させ

元記事を表示

配列の正規化でArray()を使うな!

2023年2月某日、Twitterが氷河期になりTLが荒れ狂う最中、私は一つのコードに苛まされていた。
配列の正規化を行うため、以下のコードを実行したところ、

“`rb
fp = File.new(“hoge.mp4”)
Array(fp)

=> [“謎のデータ配列”] # [fp] が帰ってくる予定だった
“`

**は????????**

## 配列の正規化とは

配列またはObject、いずれかの値がやってくる場合に、
配列または[ Object ]、に変換しその後の処理を簡潔にするためのテクニックのこと

たとえば

“`rb
def hoge(file_or_files)
# ↓ ここが配列の正規化
files = file_or_files.is_a?(Array) ? file_or_files : [file_or_files]

files.each do |file|
# 個々のファイルに対して処理をする

end
end
“`

のように書くと、引数の形式をそこまで気にせずに良くなるってヤツ

自分が確認し

元記事を表示

バイトを表す

# 6.1 バイト
すべての数値は、以下のメソッドに応答します。

“`bytes“`
“`kilobytes“`
“`megabytes“`
“`gigabytes“`
“`terabytes“`
“`petabytes“`
“`exabytes“`
これらのメソッドは、対応するバイト数を返すときに1024の倍数を使います。

“`2.kilobytes“` # => 2048
“`3.megabytes“` # => 3145728
“`3.5.gigabytes“` # => 3758096384
“`-4.exabytes“` # => -4611686018427387904
これらのメソッドには単数形の別名もあります。

1.megabyte # => 1048576
定義はactive_support/core_ext/numeric/bytes.rbにあります。

# 出典
https://railsguides.jp/active_support_core_extensions.html#numeric%E3%8

元記事を表示

独自のバリデーションを定義する

# validate
### 説明
バリデーションを定義
### 使い方
“`rb
validate(バリデーションメソッド名.., ブロック引数)
“`
### 失敗したら例外発生
“`rb
validate!(バリデーションメソッド名.., ブロック引数)
“`

## 例
### バリデーションを定義
“`rb
validate :must_be_friends
“`

### ブロック
“`rb
validate do |comment|
comment.must_be_friends
end
“`
# 出典
https://railsdoc.com/validation#validate:~:text=%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3,GitHub

# 感想
種類のないバイデーションを作成することができる。
“`:バリデーションメソッド“`を指定できることが勉強になった。

元記事を表示

Ruby [eachメソッド] eachの入れ子を使ったプログラム

# eachの入れ子

“`ruby
fruits_price = [[“apple”, [200, 250, 220]], [“orange”, [100, 120, 80]], [“melon”, [1200, 1500]]]
“`
上記配列を利用して、apple, orange, melonそれぞれの合計金額を出力するプログラムを書きます。

“`ruby
fruits_price = [[“apple”, [200, 250, 220]], [“orange”, [100, 120, 80]], [“melon”, [1200, 1500]]]
fruits_price.each do |fruit|
sum = 0
fruit[1].each do |price|
sum += price
end
puts “#{fruit[0]}の合計金額は#{sum}円です”
end
“`

– fruits_price.each do |fruit|
[“apple”, [200, 250, 220]という値を取り出し、変数fruitに代入します

元記事を表示

Ruby eachメソッド

# eachメソッドについて

eachメソッドは、配列や要素の1つひとつに対して、要素の数だけ名前をつけて取り出すことができる処理を行います。


“`ruby
colors = [“赤”, “黄”, “青”]
colors.each do |color|
puts “#{color}色”
end
“`

“`ruby
赤色
黄色
青色
# ターミナル出力
“`
each doの後にブロック変数( |[変数]| )を記述します。
そうすることで、繰り返し処理が実行されるたびに、配列・ハッシュの値がそれぞれブロック変数に格納され、その値を処理の中で使用することができます。

# timesメソッドで配列の全ての要素に対して繰り返し処理を書くとどうなる?

“`ruby
colors = [“あか”, “あお”, “きいろ”]
element_count = colors.length # 要素数を変数に代入
element_count.times do |i|
puts “色: #{colors[i]}” # 添字0から要素を出力
end
“`

“`r

元記事を表示

Turbo Rails Tutorial をやってみた! 2章

本記事は、?「Turbo Rails Tutorial」の学習を進めていく際の個人メモです!

https://www.hotrails.dev/turbo-rails

? 前章の記事はこちら

https://qiita.com/yuppymam/items/4d7a778040207cc4d698

# 2章 [Organizing CSS files in Ruby on Rails](https://www.hotrails.dev/turbo-rails/css-ruby-on-rails)

この章ではCSSについてのみ、触れていきます。このチュートリアルではCSSフレームワークは使用しませんが、「BEM」の規則に沿って厳格にCSSを1から作成していきます。

`app/assets/stylesheets/`フォルダー下に4つのフォルダーを作成します。

## `mixins`フォルダー
`mixins`フォルダー下に`_media.scss`ファイルを作成し、このアプリケーション内で使える共通のメディアクエリを作成します。
“`scss: app/assets/st

元記事を表示

Ruby if文を使った条件分岐

# 条件分岐の例

下記条件沿ってプログラムを書く。

– 条件1:10以下なら10以下の数字です
– 条件2:10より大きい数値なら10より大きい数字です
– 条件3:10以下でかつ0以下なら0以下の数字です

“`ruby
input = gets.to_i
if input <= 0 puts "0以下の数字です" elsif input <= 10 puts "10以下の数字です" else puts "10より大きい数字です" end ``` if文は先に書いた条件から判断していきます。
先に書いた条件に当てはまった場合、それより後に書いた条件に当てはまったとしても、条件の処理はスルーされてしまいます。
もし以下のように書くと、ターミナルではどのように出力されるか考えます。

“`ruby
if input <= 10 puts "10以下の数字です" elsif input <= 0 puts "0以下の数字です" end ``` 上記条件で、10を入力すると、"10以下の数字です"と返ってきます。 上記条件で、0を入力

元記事を表示

【Rails】render.comを使ってデプロイする

# 概要
– render.comを使用して、アプリケーションをデプロイする
– 無料プランを利用&クレジットカードの登録は行ない

# 開発環境
– OS:MacOS(m1チップ)
– 言語:ruby 3.1.2
– フレームワーク:Ruby on Rails7.0.2
– DB:PostgreSQL(←要注意:詳細後述)
– Docker等のコンテナは使わず、PCのローカル環境に構築

# 本番環境(production環境)を用意する
“`ruby:Gemfile
group :production do
gem “pg”
end
“`
ここで注意が必要
`gem “pg”`はPostgreSQLを使用するために導入(筆者はsqliteを使用していた)
render.comはデータベースをPostgreSQLしかサポートしていないため、
MySQLやSQLite等を使用している場合は、本番環境のデータベースのみPostgreSQLnに変更する必要がある

### gemをインストールする
“`
bundle install
“`
# render.yamlの作成
以下

元記事を表示

Cloud Run上にデプロイしたAPIサーバーが400 Bad RequestのYour client has issued a malformed or illegal requestを返す

ログにエラーが出力されず厄介な問題だったため共有します。

## 概要
GCPのCloud Run上にデプロイしたRuby on RailsのAPIサーバーにて、リクエストボディを含むGETリクエストのAPIを叩いたところ
`Your client has issued a malformed or illegal request`
と記載されたHTMLが返ってきました。以下HTMLを表示した画面です。
![スクリーンショット 2023-02-02 19.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153308/0b2dc917-9ccd-30b4-c6cc-cb92e6aed5e4.png)

## エラー詳細
ローカルでは問題なく動いており、Cloud Runにデプロイした本番環境のみで上記エラーが起こります。
Cloud Run上のログにはAPIが叩かれたことすら表示されていなく、リクエストボディを空にすると初めてログが表示されます。

## 原因
Cloud Runのようなクラウ

元記事を表示

【テックジム無料講座】Ruby on Rails講座 <問合せフォームを作ろう>の感想

テックジムが無料で開催している、Ruby on Rails講座 <問合せフォームを作ろう>をオンラインで受講してみました。Rubyを勉強した経験が無く、動画の通りには出来たものの、何をやっているのか良く解りませんでした。AWS Cloud9を利用しているので、ウェブベースで受講出来るのが便利だと思いました。現在の私の場合、テックジムさんのRuby on Rails本講座を受講する前に、progate等で、Rubyの基礎を学ばないと、独習は難しいと感じました。

1-0 環境構築編
1-1の解説動画
1-2の解説動画
1-3の解説動画
1-4の解説動画

元記事を表示

test

### 曖昧検索
“`ruby
assert_equal 1, page.all(‘a’, text: /Edit/i).count
“`

### クリック
“`ruby
find(“input[value$=’Create Category’]”).click
“`
“`ruby
# 最初の要素
find(“a”, text: /◯/i, match: :first).click
“`

### チェックボックス
“`ruby
Capybara.execute_script(
“window.scrollTo(
#{(target = find(‘label’, text: text = ‘公開設定’)).native.location.x},
#{target.native.location.y-300}
);”
)
check text
“`

### パスチェック
“`ruby
assert_equal category_menu_url(@public_category, @public_menu, locale: ‘ja’), cu

元記事を表示

rubyXLのconvenience_methods一覧

公式の方でまとめられているものを書き出しています
https://github.com/weshatheleopard/rubyXL/tree/master/lib/rubyXL

#### rubyXL/convenience_methods/cell
– change_contents
– remove_formula
– get_border
– get_border_color
– change_horizontal_alignment
– change_vertical_alignment
– change_text_wrap
– change_shrink_to_fit
– change_text_rotation
– change_text_indent
– change_border
– change_border_color
– is_italicized
– is_bolded
– is_underlined
– is_struckthrough
– font_name
– font_size
– font_color
– fill_color
– horizon

元記事を表示

【備忘録】NoMethodError: undefined method `change_contents’ for #

rubyXLを3.4.0以降のバージョンに上げたときに

“`
NoMethodError: undefined method `change_contents’ for # require ‘rubyXL/convenience_methods/cell’
require ‘rubyXL/convenience_methods/color’
require ‘rubyXL/convenience_methods/font’
require ‘rubyXL/convenience_methods/workbook’
require ‘rubyXL/convenience_methods/worksheet’

https://github-com.translate.goog/weshatheleopard/rubyXL/issues/328?_x_tr_sl=en&_x_t

元記事を表示

OTHERカテゴリの最新記事