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

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

rubyのsort_byを用いた複数条件下のおけるソート方法

## 複数条件下でソートさせる方法

`sort_by`を使うことで簡単に実現できる。

以下の例の場合、まず`val2`で昇順ソートした後に`val1`で昇順ソートされる。

“`ruby
sorted_array = array.sort_by do |val1,val2|
[val1,val2]
end
“`
また、降順ソートをしたい場合は、`-`をつけるだけでいい。
(負の数でソートすれば順番は逆になるため)
“`ruby
sorted_array = array.sort_by do |val1,val2|
[-val1,val2]
end
“`
この例だと、まず`val2`で昇順ソートされ、次に`val1`で降順ソートされる。
ただし、文字列は降順ソートできない(負の値という概念がないため)

## 実行結果

“`ruby
[1] pry(main)> array = [[2,”test2″],[1, “test2”], [3, “test1”]]
=> [[2, “test2”], [1, “test2”], [3, “test1”]]

元記事を表示

【EC2/Amazon Linux2】 S3にアップロードした画像ファイルが削除できなくて調査したこと

# 始めに
RailsアプリケーションのAction Textを使用した画像アップロード機能のテストを行なった際、
画像の削除処理がS3に反映されない現象が発生しました。

本記事は、調査に使用したコマンドと調査観点をメモしています。

# インフラ構成
調査時点のインフラ構成図は下記となっています。
AppサーバーにIAMロールを付与しており、VPCエンドポイントを経由して、S3と通信を行う構成となっています。

![スクリーンショット 2022-05-20 18.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/8f6ebae8-2e97-1dff-a09d-ad238cc0b898.png)

# 調査内容

## 対象のEC2インスタンスからS3を操作することが可能か確認
下記コマンドを実行して、 `AccessDenied`が表示されていることを確認しました。

“`shell
# 指定のバケットから一覧を取得できるか
aws s3 ls s3://指定バケット名

元記事を表示

Ruby初心者が「TryRuby」で引っかかったところ

# 概要
はじめまして,今回新しくRubyを学習するにあたって,Rubyの雰囲気を感じ取るため,WEBブラウザ上でRubyに触れることができる[TryRuby](https://try.ruby-lang.org/)をやってみました.初心者の私が「ん?」ってなったところをピックアップして何がわからなかったか, 紹介したいと思います.初心者にRubyを教えるにあたってここに引っかかりやすいかもという参考になれば幸いです.
私もいつか教える側になったときにはこれを読み返してこの部分は丁寧に教えたいですね.

# メソッドのあとの「 ! 」?

“`ruby:保存してしまい込みました
ticket = [12, 47, 35]
ticket.sort!
puts ticket
# [12, 35, 47]
“`

> リストを整列(sort)しました。変数ticketはもう変わっています。 sort!メソッドのさいごに、大きく目立つ感嘆符があるのに気づきましたか? Rubyのメソッドは、しばしば変数の中身を変更してしまう時にこのように叫びます。 ですがこれは何てことはない、ただの印です

元記事を表示

【Rails】(解決)空のデータベースに対してnil?などのメソッドで条件分岐してもエラーがでる(undefined method `〇〇◯’ for nil:NilClass (NoMethodError))

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (2.7.5)
– rails (7.0.1)
– mysql2 (0.5.3)

# はじめに
“`app/controllers/contents_controller.rb
if EgoScore.where(user_id: current_user.id).last.test_result_id.nil?
@result =”診断していません”
else
ego_score=EgoScore.where(user_id: current_user.id).last.test_result_id
@result = TestResult.find(ego_score).egogram_type
“`

“`app/views/contents/index.html
<%=@result%>
“`
上記でエラー

またnil

元記事を表示

【Rails】created_atを2ステップで日本語に設定し、ビューに表示させる方法

## 初めに

今回は2ステップで日本語に設定し、ビューに表示させる方法をまとめました。

#### このような現状にお悩みの方向けの記事です。

・データが作成された時間を日本時間で表示したい方
・ビューに以下の記述をしたところ
“`
<%= 表示したいデータの変数名.created_at %>
“`

このような時間表示になることでお悩みの方→ 2022-05-26 11:34:06 UTC

## 実装方法

### ①日本時間の表示設定をする

class Application < Rails::Application内に 日本時間に設定する表記を追加します。 ```config/application.rb module LittleArtist class Application < Rails::Application # 日本時間に設定する表記を追加 config.time_zone = 'Tokyo' end ``` サーバーを再起動します。 ``` rails s ``` ### ②ビューの設定 ``` <%= 表

元記事を表示

【脱駆け出しエンジニア】binding.pryについて

# 概要
本記事ではrailsでデバッグする際に使用するbinding.prybについてです。
会社でお恥ずかしい思いをしましたので記事として残しておきます。

# 経緯
先日、会社でこのようなやりとりがありました。

私) 「センパイ、エラーが出てるんですけど何が原因でどこでエラーが出てるかわからないっす」
先輩エンジニア)「とりあえずbinding.pry使いなよ。」
私) 「バ、バ、バインデングぷらい,,,,はにゃ?」
先輩エンジニア)「,,,え??binding.pry知らないの???それはもうif分知らないでjs書いてるのと一緒だよww(ジョーク)」

# binding.pryとは
railsで処理を一時的にストップさせるデバックツールの一つです。
エラーの発生箇所に“`binding.pry“`と記載することで処理を一時停止させることができます。
binding.pryはただ処理を止めるだけでなく、オブジェクトの参照や変更したり、その後の処理を一行ずつ実行することができます。
binding.pryは.rbファイルだけでなく、.erbファイルでも使用することができます

元記事を表示

RubocopでRails/Presence: Useと指摘を受ける

RuboCopで下記の指摘を受けました。

“`
Rails/Presence: Use self.カラム名.presence || “hogehoge” instead of self.カラム名.present? ? self.カラム名: “hogehoge”.
“`
“`rb
# 指摘を受けたソース
self.カラム名.present? ? self.カラム名: “hogehoge”
“`
どうやら、presentメソッドではなく、
presenceメソッドというものを使いなさいと指摘されているようです。

下記記事によると、
presenceメソッドは、
オブジェクトが存在すればそのオブジェクトを返し、
存在しなければnilを返したい場合にとても便利なショートカット
…とのこと。

https://techracho.bpsinc.jp/hachi8833/2021_02_26/62326

カラムが存在しない場合は、”hogehoge”という文言を返したいので、
下記ソースに修正。
二回カラム名を書く以前のソースよりシンプルになりました。
“`rb
self.カラム名

元記事を表示

URI.encodeでundefined method ‘gsub’ for nil:NilClass

# この記事のまとめ

– `URI.encode`メソッドの引数にnil渡すと`undefined method ‘gsub’ for nil:NilClass` エラーが出る
– `URI.encode`ではnil避けがされない
– `URI.encode`自体が非推奨なので`URI.encode_www_form_component`を使おう

# 実際に起こった問題

– `URI.encode`メソッドで、URLをエンコーディングしようとした
– しかし500エラーが発生した。
– スタックトレース見ると、`undefined method ‘gsub’ for nil:NilClass` が出ていた

該当コード:

“`ruby
url = post.url
post.url #nil

URI.encode(post.url) #undefined method ‘gsub’ for nil:NilClass
“`

# 対応

– `URI.encode_www_from_component`を代わりに使おう
– 実は`URI.encode`自体もう使うな

元記事を表示

RubyでPythonのようにfor i in range(n)する

# 普通のコード
rubyの普通のrangeオブジェクトだとこうです
“`ruby
(0…n).each do |i|
puts i
end
“`
for文で書き直すと以下。
“`ruby
for i in 0…n
puts i
end
“`
# range関数
しかし、私はPythonのようにrangeを書きたいと思いました。
そこで、以下の関数を定義します。
“`ruby
def range(l, r=nil, s=nil)
return 0…l unless r
return l…r unless s
(l…r).step(s)
end
“`
`range(l)`のとき、`0…l`を返す。
`range(l, r)`のとき、`l…r`を返す。
`range(l, r, s)`のとき、`(l…r).step(s)`を返す。

使い方は以下です。※コロンは不必要、endは必要です。
“`ruby
for i in range(10, 20, 2)
puts i
end
#=> 10
#=> 12
#=> 14
#=

元記事を表示

rbenvで指定してるrubyのversionと、実際のversionが違う時の対処

# rbenvで指定してるrubyのversionと、実際のversionが違う
versionがなぜかあっていない。実際のrubyのversionが更新されない。。
OS: Mac
SHELL: zsh
“`
$ ruby -v
ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.x86_64-darwin21]

$ rbenv versions
system
2.6.9
3.1.1
* 3.1.2 (set by /Users/<ホームディレクトリ>/.rbenv/version)
“`

# よくわからんけどrbenv initをする
すると、eval “$(rbenv init – zsh)”を~/.zshrcに追加すれば、rbenvを読み込んでくれるらしいことがわかる。
“`
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval “$(rbenv init – zsh)”

元記事を表示

crystal の AtCoder における pow の使用(健忘録)

# はじめに
https://qiita.com/Itoi/items/aad133bcd74e147c9e16

@Itoi さんの記事を拝見して、`Ruby`に`Integer#pow`があることを思い出しました。
しかしながら、`crystal`には**mod**する**pow**が無い様です。
とりあえず、自作関数を作ります。
# 自作関数(Ruby)
“`rb
def modinv(n, mod)
n.pow(mod – 2, mod)
end
“`
組み込み関数がありますので、シンプルです。
# 自作関数(crystal)
“`cr
def pow(v, p, mod)
ret = 1i64
while p > 0
if (p & 1i64) != 0
ret *= v
ret %= mod
end
v *= v
v %= mod
p >>= 1
end
ret
end
def modinv(n, mod)
pow(n, mod – 2, mod)
end
“`
自作と言いまして

元記事を表示

Rubyでシーザー暗号のプログラムを実装

Rubyでシーザー暗号のプログラムを作りました。

:::note warn
補足
– まだ暗号化するだけの処理です。
– 英大文字のみ対応です。
– スペースなどは考慮していません。
:::

#### シーザー暗号とは
平文の各文字を辞書順にずらして暗号文にする暗号です。

https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7

#### プログラム

“`ruby
def caesar_cipher(string = “ABC”, shift = 3)
charArray = string.chars.map(&:ord)

charArray.map do |char|
if (char + shift) < 91 (char + shift).chr else (char - 26).chr end end.join end puts caesar_cipher ``` #

元記事を表示

オブジェクト指向とは…?

Ruby学習中に聞いたオブジェクトという言葉がありますが
Rubyという言語自体がオブジェクト指向と呼ばれているらしいです。

参考資料を見ても、ふわふわとした概念だとあるので、
自分なりにまとめてみました。

[1.そもそもオブジェクトとは?](#1-そもそもオブジェクトとは?)
[2.Railsでのオブジェクト指向](#2-Railsでのオブジェクト指向)
[3.現状の認識](#3-現状の認識)
[4.参考文献](#4-参考文献)

1.そもそもオブジェクトとは?

ここでいうオブジェクトとは、
『クラス』や『メソッド』を『モノ』として
置き換えている?ような印象でした。

![スクリーンショット 2022-05-25 23.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687611/3f857595-2eeb-a939-bf8a-f1810e5df602.png)

クラス(モ

元記事を表示

ruby on rails インストール 時の注意点 自分用

https://rubyinstaller.org/downloads/

https://qiita.com/OKIDOKI000/items/25c37dd354aa471f5690

https://qiita.com/za_spa/items/6ca0d01e1156264742ab

https://udon.little-pear.net/msys2-pacman-pgp-update/

https://www.msys2.org/

https://teratail.com/questions/338070?sort=3

https://sappolog.hatenablog.com/entry/programming/ruby/devkit-install

元記事を表示

WindowsにRedmine5.0.1を手動インストールする方法

# はじめに
RubyとかRailsとか一切触ったことがなかったのでかなり苦労したが、なんとかインストールできたので備忘録をかねて記事に残しておく。

# 経緯
Bitnami版を利用すれば手軽にインストールできるのは知っていたのだが、最新版のRubyを利用したかったため、手動でのインストールに挑戦。
※手動インストールのやり方を知っておけば、社内利用においてもソフトウェア脆弱性対応とかにもわりと対応できますし(というかこれが本当の経緯)

# インストール環境
| OS | Windows Server 2019 |
|:-|:-|
| Redmine | 5.0.1 |
| DB | MariaDB 10.8.3 |
| Ruby | 3.1.2 |
| Rails | 6.1.6 |
| Webサーバ | Thin |

※Railsのバージョンは意識していない(勝手に6.1.6が入っていただけ)

# 前提
インターネットに接続できる環境でないとインストールできません。
プロキシサーバ、セキュリティソフトなどの影響もあるとインストールできないこともあるかと。

# 手順

##

元記事を表示

【Rails】ページネーションGem「kaminari」を実装をした記録②(CSSやデザイン適用)

### 初めに

画像投稿アプリを作成している中で、投稿が増えてきたため実装しました。
その過程を備忘録として投稿いたします。

ページネーションGem「kaminari」の導入〜表示の方法は前回の記事でご紹介しています。

今回はデザインを適用させる過程等を記事にまとめました。

### HTML ・ CSSの適用

##### 完成図

![スクリーンショット 2022-05-25 12.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655769/d3641f38-d5ef-9ef8-3d32-c82150108285.png)

hoverで動きを出した動画

https://gyazo.com/ad3cf10a453b9cf1a76b3d08996cb127

ページネーションをつけたいビューに以下を追加して作成しました。

元記事を表示

【Rails】ページネーションGem「kaminari」を実装をした記録①(導入〜表示)

### 初めに

画像投稿アプリを作成している中で、投稿が増えてきたため実装しました。
その過程を備忘録として投稿いたします。

### kaminariとは?

ページネーションを簡単に実装するためのGemです。
ブログでよく見かける、ページを分割するものです。

公式Git Hubに詳しい使い方が書いてありましたので、こちらも参考にしながら実装しています。

https://github.com/kaminari/kaminari

今回は以下のようなものを作成しました。

![スクリーンショット 2022-05-25 12.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655769/d3641f38-d5ef-9ef8-3d32-c82150108285.png)

こちらの記事では導入方法〜表示方法を紹介しています。
CSSの適用だけ見たい方は[Rails] Formオブジェクトに使えるmodule

## 概要
Formオブジェクトなどを実装する場合、`ActiveModel::Model`をincludeしたPOROクラスを実装することがあると思います。
この記事ではその際に、追加のmoduleを使ってできることをまとめてみました。

## 環境
Rails: 7.0.3

## ActiveModel::API
まずはこの`ActiveModel::API`をincludeすることから始まります。
これにより、以下のような機能が利用できます。
– `form_with`や`render`などのAction Viewのヘルパーメソッド
– 値のvalidation

### tips
– 値を上書きしたい場合、対象のattributeは`attr_reader`にしておき、`#{attr_name}=`のsetterを定義します。

“`ruby:email_contact.rb
class EmailContact
include ActiveModel::Model

# 値を変更したい場合、ここはattr_readerだけにして、setterメソッドを定義する

元記事を表示

[初心者向け]Rubyを手っ取り早く解説

# 導入
Rubyのインストールは事前に行ってください。
Rubyのコードの実行の仕方も他で検索してください。

専門用語は極力使わないようにしています。
# 解説
## 表示
“`ruby
puts “Hello World!”
“`
`puts`の後に表示したい文字を書くと、表示されます。
表示させるような文字は、基本的に、`”`で囲みます。
“`ruby
puts “Hello World!” #=> Hello World!
“`
`#`以降はコメントになります。ここに何を書いても、プログラムの実行には影響しません。
以下読みやすいように、`#=>`の後に、`puts`で何が表示されるのかを書くことにします。

## 計算
“`ruby
puts 9 + 3 #=> 12
puts 9 – 3 #=> 6
puts 9 * 4 #=> 36
puts 9 / 4 #=> 2
puts 9 % 4 #=> 1
“`
上から順に、「たす、ひく、かける、わる、あまり」です。
数字の計算ができます。(数字は`”`で囲みません。)
## 変数
“`ruby
a = 3
pu

元記事を表示

Rubyメソッド逆引きメモ

Rubyにおける逆引きメモです。「やりたいこと→メソッド」という形にしています。項目ごとに公式ドキュメントへのリンクを付けてますので合わせて参考にしてください。

:::note info
現状は項目を羅列しているだけなので読みづらいかもしれません。
:::

# オブジェクト調査係

サンプル用コード
“`ruby
class User
def initialize()
@name = “bob”
end
end

user = User.new
“`

##### オブジェクトが持つインスタンス変数名を調べる[^1]
“`ruby
p user.instance_variables
#=> [:@name]
“`
– 変数名をシンボルの配列として返します。
– 初期化していない変数は返されません。

##### オブジェクトのインスタンス変数の値を調べる[^2]
“`ruby
p user.instance_variable_get(“@name”)
#=> “bob”
“`
– 引数にはシンボルも使えます。`(:@name)`

元記事を表示

OTHERカテゴリの最新記事