- 1. 【Ruby】例外処理を追加する方法
- 2. Ruby include?メソッドを使ってプログラムを作成する
- 3. AbstractController::DoubleRenderError
- 4. 【Ruby on Rails】enum の日本語化は gem なしで実現できる
- 5. Ruby even?メソッド
- 6. Rackの脆弱性対応を! (CVE-2022-44570,CVE-2022-44571,CVE-2022-44572)
- 7. 【Ruby】複数の配列を結合しハッシュのネストに追加する方法
- 8. 【Ruby】2次元配列にソートをかける方法
- 9. ②ストロングパラメーターについて
- 10. 【Ruby】配列にランダムな値を追加する方法
- 11. 【Ruby】ハッシュのキーと値のペアを配列に変換する方法
- 12. Rails apiモードでjsonではなく文字列を返す方法
- 13. rubyでの定数の宣言
- 14. 日付や数値のフォーマット
- 15. [軽量化] マルチステージビルドによるrails環境のdocker化
- 16. Ruby オプションを作れるoptparseの使い方(簡単に)
- 17. Ruby if, elseを使ったプログラムの作成
- 18. 【Ruby on Rails】Dockerからコンソールを起動させる方法
- 19. UpperCamelCase -> lowerCamelCase
- 20. 【Ruby】Googleスプレッドシートのデータをリストとして取得する方法
【Ruby】例外処理を追加する方法
# 前提条件
– Ruby 3.1.0# やりたいこと
作成した機能に例外処理を追加したい。# 方法
### begin – rescueを使う
“` ruby
begin
# 普通の処理
rescue => e
# 例外時の処理
end
“`
# 補足
– beginを省略することができる。
“` ruby:
def foo
# 普通の処理
rescue => e
# 例外時の処理
end
“`
– 例外クラスを指定することができる。
“` ruby:
def foo
# 普通の処理
rescue <例外クラス名> => e
# 例外時の処理
end
“`
※例外クラスは下記参照
https://docs.ruby-lang.org/ja/2.1.0/library/_builtin.html# 参考
https://qiita.com/sue738/items/d0d6ca135c4546222159
https://qiita.com/murata0705/items/6ae346bd04197fb2e36a
Ruby include?メソッドを使ってプログラムを作成する
# include?メソッド
include?メソッドについては以前の投稿で書きました。https://qiita.com/ta–i/items/3a7004d890bccf7ad2c1
今回include?メソッドをもう一度調べているときに、大文字小文字を区別せずに検索する方法があることを知りました。
例:大文字小文字を区別せずに検索する
“`ruby
string = “Hello World”
puts string.downcase.include?(“hello world”)
“`
“`ruby
true
# ターミナル出力
“`
downcaseメソッドは、大文字を小文字に変換します。
今回は小文字に変換して、(“hello world”)を検索したという流れです。# include?メソッドを使って、特定の数字が含まれているかをチェックするプログラムを作成
下記条件です。
– 条件1:配列内に1,2,3が全て入っている場合は、「True」と出力すること
– 条件2:配列内に1,2,3の全てが入っていない場合は、「False」と出力すること`
AbstractController::DoubleRenderError
# はじめに
フリマアプリを実装中のエラーです。
ログイン状態、ログアウト状態で遷移できるページを変更したい実装中に
`AbstractController::DoubleRenderError`のデバックを記載しています。
URLは直打ちで入力する事とします!実装したいこと
* ログイン状態でも自身が出品していない編集ページへ遷移しようとするとトップページに遷移する。
* ログアウト状態で商品編集ページに遷移しようとするとログインページに遷移する。以上の2点を実装しようとしています。
# エラーまでの経緯 ~コード紹介~
~~~ruby items_controller.rb
def edit
redirect_to new_user_session_path unless user_signed_in?
if current_user.id != @item.user_id
redirect_to root_path
end
end
~~~以上の実装で
~~~
AbstractController::DoubleRenderErr
【Ruby on Rails】enum の日本語化は gem なしで実現できる
# はじめに
こんにちは、 [FarStep](https://twitter.com/8SKeEdvtHfOcczY) です。
Rails でアプリケーションを作成していると enum の値を日本語化する場面があると思います。
そんなとき [enum_help](https://github.com/zmbacker/enum_help) を導入していませんか?もちろん enum_help を用いた enum の日本語化も間違った実装ではありません。
しかし、アプリケーションにインストールする gem は少ないに越したことはありません。
なぜなら、– gem が多いとアプリケーションの保守が大変になる(Rails との依存関係等)
– gem はメンテナンスがいつ終わるか分からないといった理由があるからです。
そこで本記事では **gem を使わずに** enum の値を日本語化する方法を紹介します。
それでは、始めましょう ?# 環境
最初に、動作確認を行う環境について説明します。
Ruby と Ruby on Rails のバージョンは下記の通りです。
Ruby even?メソッド
# even?メソッド
対象の数値が「偶数」かどうかを判断するメソッド。
対象の要素の値が偶数であれば真を返し、そうでない場合は偽を返します。
これはRubyが元々用意しているメソッドです。下記URLはeven?メソッドの公式リファレンスです。
https://docs.ruby-lang.org/ja/latest/method/Integer/i/even=3f.html例1
“`ruby
puts 10.even?
“`
“`ruby
true
# ターミナルの返し
“`
例2
“`ruby
puts 5.even?
“`
“`ruby
false
# ターミナルの返し
“`# even?メソッドを使って偶数血の取得をするプログラムを作成します
配列にある値の中から偶数の数をカウントして出力するメソッドを作ります。出力例:
“`ruby
count_evens([2, 1, 2, 3, 4]) → 3
count_evens([2, 2, 0]) → 3
count_evens([1, 3, 5]) → 0
“`“`ruby
def c
Rackの脆弱性対応を! (CVE-2022-44570,CVE-2022-44571,CVE-2022-44572)
2023年1月18日にRuby on Railsの脆弱性[^1]とは別にRackの脆弱性が公表されました。
https://discuss.rubyonrails.org/t/cve-2022-44570-possible-denial-of-service-vulnerability-in-racks-range-header-parsing/82125
https://discuss.rubyonrails.org/t/cve-2022-44571-possible-denial-of-service-vulnerability-in-rack-content-disposition-parsing/82126
https://discuss.rubyonrails.org/t/cve-2022-44572-possible-denial-of-service-vulnerability-in-racks-rfc2183-boundary-parsing/82124
どれもReDoSの問題であり、CVE-2022-44571とCVE-2022-44572は以下の特徴により危
【Ruby】複数の配列を結合しハッシュのネストに追加する方法
# 前提条件
– Ruby 3.1.0
# やりたいこと
下記データを結合し、ハッシュのネストに追加したい。
“` ruby:
@fruits = [[‘りんご’,’赤’,’丸い’],[‘メロン’,’緑’,’丸い’],[‘バナナ’,’黄’,’細長い’],…]
@vegetables = [[‘大根’,’白’,’細長い’],[‘トマト’,’赤’,’丸い’],[‘キャベツ’,’緑’,’丸い’],…]
“`# 方法
### 1. ハッシュのネストを作成する
“` ruby:実装
# ハッシュのネストを作成する
hash = Hash.new {|h1, k1|
h1[k1] = Hash.new {|h2, k2|
h2[k2] = []
}
}
“`
### 2. ハッシュのネストにデータを投入する
“` ruby:実装
@fruits.each do |fruit|
# 変数を定義する
fruit_color = fruit[1]
fruit_shape = fruit[2]@vegetables.each do |vege|
【Ruby】2次元配列にソートをかける方法
# 前提条件
– Ruby 3.1.0
# やりたいこと
下記2次元配列の子要素の1番要素を昇順でソートしたい。
“`
array = [
[0,5],
[1,4],
[2,3],
[3,2],
[4,1],
[5,0]
]
“`# 方法
### sort_byメソッドを使う
“` ruby:実装
# xの引数にソートをかけたい要素を指定
array = array.sort_by {|x| x[1]}
“`
“` : 結果
array = [
[5,0],
[4,1],
[3,2],
[2,3],
[1,4],
[0,5],
]
“`# 参考
https://qiita.com/takanatsu/items/39cf827aadc7d06bf48c
②ストロングパラメーターについて
本日はストロングパラメーターについて投稿します。
○ストロングパラメーターとは
—Ruby on rilsのアプリケーションにおいて不正なデータを取得しないように指定する
アプリ内の警備員みたいなもの。(例えが間違っていたらすいません。。):sweat_smile:ストロングパラメーターを使う為には2つのメソッドを使用します。
①require(リクワイア)メソッド
—送信されたパラメーターの情報を持つparamsが使用出来るメソッドの事。
パラメーターからどの情報を取得するか選択する事が出来る。
使い方
““`
paras.require(:モデル名)
““`さらに指定したパラーメーターをより限定した時に使うのがpermitメソッドです。
②parmitメソッド
—requieメソッドと同じでparamsが使用出来るメソッド。
取得したいキーを指定出来て、その中の値のセットのみ取得出来る。
使い方
““`
params.require(:モデル名).parmit(キー名)
““`まだ僕自身ざっくりな理解ですが日々アウト
【Ruby】配列にランダムな値を追加する方法
# 前提条件
– Ruby 3.1.0# 背景
未完成のDBやスプレッドシートなどからデータを配列に格納する際、不足しているカラム値を追加する必要がある。
そこで不足しているカラム値にランダムな値を仮置きする。# やりたいこと
配列にランダムな値を追加したい。# 方法
### randメソッドを使う
“` ruby:実装
# 配列を用意する
array = [‘0′,’1′,’2′,’3′,’4’]
# 配列の5番要素に「0以上10未満の整数」を格納する
array[5] = rand(10).to_s
“`
配列の5番要素にランダム値「8」が格納された。
“` :結果
> [‘0′,’1′,’2′,’3′,’4′,’8’]
“`# 参考
https://pikawaka.com/ruby/rand
【Ruby】ハッシュのキーと値のペアを配列に変換する方法
# 前提条件
– Ruby 3.1.0# やりたいこと
作成したハッシュをリストに変換する。# 方法
### to_aメソッドを使う
下記コンソールでは次のことを実行している。
① ハッシュを作成する。
② ハッシュをto_aメソッドで配列に変換する
“` :コンソール
irb(main)> h = {“number1″=>1, “number2″=>2, “number3″=>3}
irb(main)> h.to_a
=> [[“number1”, 1], [“number2”, 2], [“number3”, 3]]
“`# 参考
https://scrapbox.io/rubytips/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E9%85%8D%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B
Rails apiモードでjsonではなく文字列を返す方法
Rails apiモードで、jsonではなく文字列(string)を返却したい時の方法について記載する。
あまり使わない方法だと思うが、
先日token(string)のみを返すエンドポイントを作成する必要があり、
方法がわからず困ったのでメモ的に残す。# 返したい値
今回やりたいイメージ。returnを使うわけではないがイメージとしてわかりやすいので。
“`ruby:string(ただの文字列)
return token
“`通常だとこういう形式になる。
“`ruby:json(普通はこの形式で値を返す)
return { “token” : “token” }
“`# 方法
renderメソッドで `:json => “文字列”` とする
“`ruby:controller.rb
render :json => ‘This is the string’
“`
rubyでの定数の宣言
# はじめに
Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。# 定数宣言時の注意点
### 全て大文字で宣言する
“`ruby
BASE_TITLE = “EC Site”
“`### freezeする
定数を扱うときは`freeze`するよう必要がある(`ruby`における定数は意図せずに書き換えられることがあるらしい)
`freeze`していなくともアプリケーションは動いたが、`rubocop`などでスキャンすると指摘される。
> `freeze`していない状態で`rubocop-airbnb`でスキャンした際は、「Freeze mutable objects assigned to constants.」と指摘された
>“`ruby
BASE_TITLE = “EC Site”.freeze
“`### メソッド外で定義する
“`ruby
module Applicat
日付や数値のフォーマット
# はじめに
Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。# フォーマット指定による変換
日付や時刻、数値を書式を指定して文字列にする場合の記述方法について解説。
(Rubyの`Date`や`DateTime`などの日付型の値や、`Integer`、`Float`などの数値をフォーマット指定で文字列に変換する記述方法について)
# 日付のフォーマット
Rubyで日付型をフォーマット指定で文字列に変換するときは、`strftime`メソッドを使用する。
`strftime`メソッドは日付を扱う`Date`クラス、時間を扱う`Time`クラス、日時を扱う`DateTime`クラス全てに適用できる。
### `strftime`メソッド構文
“`ruby
Date.strftime([“format文字列”])
Time.strftime([“format文字列”])
DateTime.strftime
[軽量化] マルチステージビルドによるrails環境のdocker化
## rails環境のdocker化
rails環境のdocker化についてまとめます。
dockerの軽量化のためにマルチステージビルドで環境を構築します。### 各種バージョン
– rails 6.0.6.1
– ruby 3.0.2
– node 15.0.1
– postgresql 14.6-alpine### Dockerfileの作成
リポジトリに `dockerfile` を作成。`apt-get install` を使用せずに下記のようにマルチステージビルドでnodeをインストールすることで、dockerの軽量化およびbuildの時間短縮が期待できます。“` docker
FROM node:15.0.1
FROM ruby:3.0.2COPY –from=node /opt/yarn-* /opt/yarn
COPY –from=node /usr/local/bin/node /usr/local/bin/
COPY –from=node /usr/local/lib/node_modules/ /usr/local/lib/node
Ruby オプションを作れるoptparseの使い方(簡単に)
# はじめに
ターミナルで`ls -a`や`ruby -v`などオプションを指定するとそれに対応する実行がされるが、rubyで自身でオプションが作れないかと思ったところこの`optparse`の存在を知った。# バージョン
ruby 3.1.3# optparseとは
– rubyにデフォルトで搭載されている標準ライブラリの1つ。
– コマンドラインのオプション操作を取り扱う時に使われる。# optparseを使ってみる
今回はオプションで指定した数字の**5の倍数**を出力することを目標とします。まずは完成品のコードになります。
“`ruby:optparse.rb
require ‘optparse’opt = OptionParser.new
opt.on(‘-n’) {|v| v}
opt.parse(ARGV)
select_number = ARGV[1].to_i
p select_number * 5
“`
ターミナルでは`-n`オプションを指定し、引数に6を入れる想定とします。
“`:terminal
$ ruby optparse.rb –
Ruby if, elseを使ったプログラムの作成
# if, elseを使ってプログラムを作成します
条件は以下の通りです。
– 条件1:第一引数にオウムが鳴く場合はtrueを指定し、鳴かないfalseを指定する
– 条件2:第二引数には時間を指定する(ただし、「分」は考えないものとする)
– 条件3:20時から翌朝7時までの間にオウムが鳴いた場合は「NG」と出力する(20時と7時は含まれない)
– 条件4:上記以外の場合は「OK」と出力する“`ruby
def parrot_trouble(talking, hour)
if talking && (hour < 7 || hour > 20)
puts “NG”
else
puts “OK”
end
end# 呼び出し例
parrot_trouble(true, 6)
“`“`ruby
NG
# ターミナル出力
“`## 解説
オウムが鳴いている時間帯が20時〜7時 → NG
上記以外の場合にはOKを出力されるように記述を考えていきます。– 第一引数”talking”について
オウムが鳴いているか・鳴いていないかの真偽判定
【Ruby on Rails】Dockerからコンソールを起動させる方法
# 背景
Dockerを用いたチーム開発でターミナルから直接`rails c`を実行してもコンソールを起動できない。
“` :コンソール
$ rails c
=>
Rails is not currently installed on this system. To get the latest version, simply type:$ sudo gem install rails
You can then rerun your “rails” command.
“`# 方法
下記の順番で実行する。
“` :コンソール
$ Docker compose up -d
$ Docker compose run –rm api bash
bash-5.1# rails c
“`
`$ Docker compose up -d`
まず作成したコンテナを起動する。
`$ Docker compose run –rm api bash`
apiサービスを開始し、サービス内でbashとしてコマンドを実行する。# 参考
https://docs.do
UpperCamelCase -> lowerCamelCase
gsubがブロック受けれるの今更ながらに知ったのでメモ
“`ruby
list = [‘AlphaBeta’, ‘FooBar’]
# => [“AlphaBeta”, “FooBar”]list.map { |item| item.gsub(/^[A-Z]/) { |i| i.downcase } }
# => [“alphaBeta”, “fooBar”]
“`
【Ruby】Googleスプレッドシートのデータをリストとして取得する方法
# 前提条件
– Ruby 3.1.0
– 環境構築~GoogleAPI連携が完了していること(詳細は参考サイト参照)# やりたいこと
Googleスプレッドシートのデータをリストとして取得したい。# 方法
### 1. データ取得するメソッドを作成する
“` ruby:Spreadsheet.rb
require ‘googleauth’
require ‘google/apis/sheets_v4’module ABC
class Spreadsheet
SCOPE = [
‘https://www.googleapis.com/auth/drive’,
‘https://www.googleapis.com/auth/spreadsheets’
]def initialize
・・・
@service = Google::Apis::SheetsV4::SheetsService.new
end# スプレッドシートIDとセルの範囲を引数にデータを取得する
de