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

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

配列の正規化で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

元記事を表示

【Rails】同一モデルの異なるレコードを複数作成し、同時にcreateする方法

# どうした?
[前回の記事](https://qiita.com/ysk91_engineer/items/c1830885866583160047)同様、ToDoアプリを作成しています。
Todoの投稿フォームを複数個作成し、同時に投稿する方法を学んだのでそのアウトプットです。

# 目標物の確認
今回実装する機能は下図です。
![ToDoApp_設計書 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/ce333e4b-c358-4784-423d-c77b324baa7c.png)

`Todo.content`同士は異なるレコードです。
ボタンひとつで複数のレコードをいっぺんに作成します。

# 方法

**コントローラ**
“`ruby
def index
# 略

@category = Category.new
2.times { @category.todos.build }
end
“`

今回は**インデックスページで`new`していること*

元記事を表示

【Rails】Capistranoを利用した自動デプロイ実行時に発生したエラーの対処法

某スクールの最終課題をEC2で自動デプロイする時に発生した事象。
自動デプロイツール「Capistrano」を導入し、自動デプロイを実行した際に発生したエラーの詳細と解決方法について記載します。
導入目的:デプロイ時に必要なコマンド操作が1回で済み、手動デプロイする場合に起こりうる下記問題を解消することができる。
##### 手動デプロイで起こりがちな問題
・コマンドの打ち間違い、手順の間違いが発生する可能性がある
・手順が多く、煩わしい

## 発生したエラー
自動デプロイを実行する為に、ローカルターミナルで以下コマンドを実行したところ、
“`
% bundle exec cap production deploy
“`
以下エラーメッセージが出現。メッセージを見ると、「Bundler::GemNotFound: Could not find date-3.3.3 in any of the sources(gemfileの中に”date-3.3.3”が見つからないよ。)」とのこと。
“`
** DEPLOY FAILED
** Refer to log/capistrano

元記事を表示

【Rails6】親子関係のモデルに対して一度に値を入力する多分最もシンプルな方法【fields_for】

# どうした?
RailsでToDoアプリを開発しています。
ToDoリストを作成する時、
+ 親モデル: Category
+ 子モデル: Todo

を1つの動作で同時に作成する方法を調べたので、そのアウトプットです。

## 目標物の確認
今回作成するアプリはcategories/indexページにて新規投稿します。
新規投稿エリアには`category.title`と`todo.content`の記入欄を用意し、「投稿」ボタンを1つ押すだけで両方のモデルに対して`create`されるようにします。

![ToDoApp_設計書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/1b116ff9-7010-0218-8d46-ba1a2b3fe18b.png)

## 動作環境
“`ruby
$ ruby -v
=> ruby 3.0.2

$ rails -v
=> rails 6.1.7
“`

# 方法

## Model
本アプリでは親モデルに`Category`, 子モ

元記事を表示

Railsでupdated_atがばらばらなテストデータを作りたい

備忘録

結論

gem fakerを利用するぅ

“`
group :development, :test do
gem ‘faker’
end
“`

今回は既存データをアップデートしてます。

“`
models.each do |hoge|
fake_date = Faker::Date.between(from: 100.days.ago, to: Date.today)
hoge.update(Model.touch_attributes_with_time(*[], time: fake_date))
end
“`

元記事を表示

【Rails】EC2内でgemをインストールした際に発生したエラーの対処法

某スクールの最終課題をEC2でデプロイする時に発生した事象。(RenderからEC2への移行)
EC2にクローンしたアプリを起動する為に必要なgemをインストールする際に、
上手くインストールが出来ず解決にかなり時間を費やしてしまった為、
備忘録として以下にエラーの詳細と解決方法を記述しておきたいと思います。

## 発生したエラー
先ず、ローカル環境「bunder2.1.4」と同じバージョンのbundlerをEC2側でも導入する為に、下記コマンドを実行。
“`
[ec2-user@ip-***-**-**-*** <リポジトリ名>]$ gem install bundler -v 2.1.4
[ec2-user@ip-***-**-**-*** <リポジトリ名>]$ bundle install
“`
すると、下記エラーメッセージが出現。
メッセージの内容はターミナル上でpgのバージョン’1.4.5’を導入する必要があるとのこと。
“`
An error occurred while installing pg (1.4.5), and Bundler cannot conti

元記事を表示

Ruby include?メソッド

# include?メソッド
指定した値が配列や文字列内に含まれているかを判定するメソッドです。
指定した値が含まれている→true
指定した値が含まれていない→false  を返り値として返します。

例1
“`ruby
string = [“hello”, “goodbye”]
puts string.include?(“hello”)
“`

“`
true
# ターミナル出力
“`
例2
“`ruby
string = [“hello”, “goodbye”]
puts string.include?(“thanks”)
“`

“`
false
# ターミナル出力
“`

# include?メソッドとif文を使って文字列を検知するプログラムを作成する

条件1:名前を入力すると「登録が完了しました」という文字列を出力すること
条件2:名前の中にピリオド(.)がある場合は、「 “!エラー!記号は登録できません”」という文字列を出力すること
条件3:名前の中に空白(半角のみ)がある場合は、「 “!エラー!空白は登録できません”」という文字列を出力すること
※今回

元記事を表示

Railsのsanitizeを深追いしてみる

# はじめに

Railsには`sanitize`というHTML中のscriptタグなどを除去してくれるメソッドが存在しており、動的にHTMLを出力する際にXSS対策に有効な手段として広く使われています。

どのようなタグを除去してくれるか等、`sanitize`メソッドの実装が気になり調べてみたので備忘録として残しておきます。

# 調査

はじめにRailsコンソールで`sanitize`メソッドの定義元を調べます。

“`ruby:rails console
> helper.method(:sanitize).source_location
=> [“/Users/massaaaaan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/actionview-6.1.7.1/lib/action_view/helpers/sanitize_helper.rb”, 81]
“`

これで`sanitize`メソッドは`ActionView::Helpers::SanitizeHelper`というモジュールで定義されていることがわかりま

元記事を表示

OTHERカテゴリの最新記事