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

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

【Rails】nil? empty? blank? present? exists?メソッドについて【Ruby】

## はじめに
 本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## nil? empty? blank? present? exists?メソッドについて

### nil?
対象がnilの時は`true`をそうでなければ`false`を返します。
nilは「何も存在しない」状態です(nullと同じ)。

“`ruby:trueを返す例
sample = nil
p sample.nil?
# true
“`

“`ruby:falseを返す例
sample1 = “”
p sample1.nil?
# false

sample2 = 0
p sample2.nil?
# false

sample3 = []
p sample3.nil?
# false
“`

### empty?
empty?メソッドは対象が空の文字列や空の配列の場合に`true`を

元記事を表示

【rails】登録日の表示について

はじめに

今回はdeviseというgemを使った環境だったのでcreated_at(登録日)というカラムが最初から入っていました。
なのでそれを使います。

結論

“`rails:index.html.erb

登録日
<%= current_user.created_at.strftime('%Y/%m/%d') %>

“`
こちらのコードを表示させると

![スクリーンショット 2022-02-26 21.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340036/5d8deea6-d92f-adfb-8b29-5e36e878899e.png)

こうなります!

注意点

ログイン(新規登録)してからじゃないと、current_userがエラーを起こしますのでご注意を!

元記事を表示

MVCの説明わかりやすく、、、

MVCの仕組みについて簡単な説明を

色んなサイトを見てわかりやすい説明とわかりにくい説明がちらほら。

自分も得意ではありませんが、自分なりに少し時間をとって自分なりにわかりやすく説明を作ってみました。

アウトプットするので参考になればと思います。


「MVCとは、アプリケーション全体のコードを機能ごとに分けて整理、管理するための概念です。
役割ごとに機能をセットすることで、可読性や保守性の高いコードを維持することができます。

MVCは3つに分けた各機能の頭文字であり、
「M」は「MODEL」の略で、データ管理の役割を持つシステム本体となる部分です。
ユーザーからのアクセスによって促された処理を、データベースにアクセスし操作・参照しまたは変換してビューに表示します。

「V」は「VIEW」の略で、クライアント側にデータを表示します。

「C」は「CONTROLLER」の略で、クライアント側とビュー・モデル側との橋渡し役になります。
ユーザーが入力した情報に基づいて、モデルへは必要に応じてデータを取り出す指示を、ビュ

DBパフォーマンスを意識したRailsの書き方まとめ

# DBパフォーマンスを意識したRailsの書き方まとめ

Railsではデータセットが巨大化したときのデフォルトのパフォーマンスがかなり低下するケースがあります。

そんなときに気をつけた方が良いポイントを記載します。

## 1. N+1
N+1は簡単に言うと必要以上に SQL が走るせいでパフォーマンスが低下する問題です。

### 悪い例

“` ruby: tweets_controller.rb
class UsersController < ApplicationController def index @tweets = Tweets.all end end ``` ``` ruby: index.html.erb <% @tweets.each do |tweet| %>
<%= tweet.user.name %> # ここでN+1が起きている
<% end %>
“`
この書き方だと、tweetsの数だけSQLが発行されるのでパフォーマンスが落ちます。

### 良い例

“` ruby: tweets_controller.rb
c

AとBが同じではない時について(if 文)

簡易的なフリマアプリを作成中。

全てのコードを書き終えて、最終挙動確認を実施。

「自分の出品商品以外の商品には編集ページへ遷移しない」という挙動を確かめるため、直接URLに`/edit`を入力。
すると、意図と反して編集ページに移ってしまう。

該当するソースコードを確認。

“`ruby:controllers/item_controller.rb
private
def move_to_index
if !user_signed_in? && current_user.id == @item.user.id
redirect_to root_path
elsif @item.order.present?
redirect_to root_path
end
end
“`

よく見てみると`!`の位置がおかしい。
これだと「ユーザーがログインしていない時、かつログイン中のユーザーIDと出品した商品のユーザーIDが同じ時」というめちゃくちゃな日本語に笑
※「ログインいしていない時、かつログイン中」という矛盾が生じている

引数をそのまま戻すメソッドを作る際の注意

# クイズ:引数をそのまま戻すメソッドを作りなさい。

与えた引数がそのまま戻ってくるメソッドってありますよね、`p`とか。そんなメソッドを作ってください。ただし引数は 1 つとは限りません。(キーワード引数やブロックは考えないことにします。)

つまり、以下のような結果が得られるメソッドです。

“`ruby
return_args() # => nil
return_args(1) # => 1
return_args(1, 2) # => [1, 2]
“`

クイズ形式にしてみましたが、私自身がそんなメソッドを作った際に引っかかってしまったので戒めの記事です。無駄に長くなってしまったので、結論だけ知りたい人は[#結論](#結論)へどうぞ。

記事中の実行結果はすべて以下のバージョンの Ruby を用いています。

“`
ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux]
“`

## 引数転送 `…` が使えるのでは?

Ruby 2.7 で`…`による引数の転送ができるよう

form_withについて

## はじめに
form_withは初学者にとって理解しずらい部分だと思います。
modelオプションとurlオプションのところで、よく分かってなかったことがありました。
## フォームとは
ユーザーが情報を入力する入力欄のこと。
アカウント登録ページに出てくる名前とかemailとかを入力する四角い箱の事です。
## form_withとは
フォーム作りを助けてくれるヘルパーメソッドです。
ヘルパーメソッドとはRailsにおける、主にビューでHTMLタグを出現させたりテキストを加工するために使うメソッドの総称です。

例えば、HTMLで以下のように書くのを

“`html



“`

以下のように書きます。

“`ruby
<%= form_with url: "/tweets", method: :post, local: true do |f

AWSのS3で画像が保存できない

簡易的なフリマアプリを作成中。

AWSのS3に画像を保存するための実装を実施。
必要なファイルや記述なども終え、まずローカル環境で画像がS3に保存できるかの挙動確認を行う。

が、__エラー発生。__

エラー文は以下の通り。

“`
NoMethodError (undefined method `upload’ for nil:NilClass):
“`

「スペルミスでもしたかな?」

まずは今回新たに追記した`config/environments/development`と`config/storage.yml`のファイルを見直す。
しかし特に間違っている様子はない。

次にエラー内容をgoogleにて検索。
すると、同じ境遇の方々がたくさんいらっしゃいました笑
それぞれの記事を見ていると「:が抜けている」や「””を忘れている」などの内容が多かったので、再度その辺りを確認するため、各コードを見直し。
が、やはり間違いが見当たらない・・・

S3に入る直前に挙動確認を行った際は、問題なく画像が保存されていたので、コードの書き間違いは考えにくい。
間違いがあるのはcon

テスト

・テスト

【RSpec】テストコードはループを使わない方がベター

# なぜループ処理を使わない方がいいのか

テストコードは仕様がひと目でわかることが大事なため、可読性が下がるループはしない方がベター

“`ruby
describe ‘#format_date_of_birth’ do
it ‘生年月日を和暦で表示すること’ do
%w(1977-06-06 1988-06-06 1989-06-06 2016-06-06).each do |date_text|
date = Date.parse(date_text)
person = Person.new(‘Taro’, date)
jp_year = date.year >= 1989 ? “平成#{date.year – 1988}年” : “昭和#{date.year – 1925}年”
expected = “#{jp_year}#{date.month}月#{date.day}日”
expect(person.format_date_of_birth).to eq expecte

AWSのEC2の環境構築で参考にしたサイト(rails,docker,nginx)

以下のインフラ環境を構築するまでに参考にしたサイトをご紹介します。

# 1,AWSの全体的な知識を付けるために参考にしたもの
<動画教材>
WEBエンジニアの山浦さんのUdemyの動画教材です。
解説が初心者に優しく、わかりやすいのでおすすめです。

https://www.udemy.com/course/aws-and-infra/

<書籍>
解説がわかりやすいです。
イラスト使って説明してくれるので、なにをやっているのかイメージしやすく、すぐに読み終えることができました。

https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=sr_1_15?__mk

私が作ったオリジナルアプリを公開します!

はじめに

スクール卒業後に、独学で完成させました。
まだまだ未熟ですが、誰かの参考や希望になればと思い、投稿します。

①「冷蔵庫の中身がわかるアプリ」

https://reizoko-app.herokuapp.com/
(ユーザー名: reizoko /パスワード: 11770)

[GitHubコード:https://github.com/mina153/reizoko-app ]

冷蔵庫の中身を記録するアプリです。
同年代の方と「どんなアプリが欲しいか」というテーマで討論したときに、出た意見を参考にして、このアプリを作りました。

工夫した点は、
 ・ユーザーが飽きないように、CSSを使ったアニメーションを追加した
 ・hoverを使うなどして、アプリに動きをつけた
 ・テストコードも書き、より実務に近づけた
 ・Basic認証でセキュリティを考慮した (今回は誰でも触れるように公開してます。)
です。

②「自分の好きなものについて投稿できるインスタ風のアプリ」

オリジナルアプリ:https://ramen-app-3.herokuapp.com/
(ユーザー

「Herokuで画像表示できない」を解決

# はじめに
 現在オリジナルアプリの開発中です。Heroku環境でアプリをアップロードしているのですが、assetsに配置した画像が表示されないという問題がありました。解決方法がわかったのでまとめておきます。

# 問題
 app/assets/images 配下に設置した画像が表示されない。(ローカル環境では表示されている)

ローカル環境では表示されているため、本番環境では追加の設定がいるのかもしれない。と思い調べると解決方法が出てきました。

# 解決方法
 解決方法は image_tagのファイルの指定方法を修正することでした。

“`qiita.rb
<%= image_tag "/assets/top.png" ,class:"img-fluid" %>
“`

image_tagに渡す画像のバスの指定方法を間違えていました。
この書き方では、ローカルだと表示されるのですが、本番環境だと表示されません。

以下に修正しました。

“`qiita.rb
<%= image_tag "top.png" ,class:"img-fluid" %>
“`

結果無

【Rails】find_or_initialize_byとfind_or_create_byの違い

# find_or_create_by

条件を指定して初めの1件を取得(find)し、1件もなければ作成(create)
作成する時に呼ぶメソッドが**create**なので、新規作成して保存まで行う

“`ruby
Category.find_or_create_by!(name: “ディナー”)
Category Load (0.6ms) SELECT “categories”.* FROM “categories” WHERE “categories”.”name” = $1 LIMIT $2 [[“name”, “ディナー”], [“LIMIT”, 1]]
TRANSACTION (0.5ms) BEGIN
Category Create (2.0ms) INSERT INTO “categories” (“name”, “created_at”, “updated_at”) VALUES ($1, $2, $3) RETURNING “id” [[“name”, “ディナー”], [“created_at”, “2022-02-21 12:19:1

Rails6 Action Text と Active Storageの実装 Cloudenaryにアップロード リッチテキスト 複数画像投稿

# 環境
“`
$ rails -v
Rails 6.1.4.4

$ ruby -v
ruby 3.0.2

macOS Monterey
version 12.2
“`

デモ
![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/76d47081-5093-39a4-5c91-556302a2835a.gif)

# 参考記事
https://railsguides.jp/active_storage_overview.html

https://railsguides.jp/action_text_overview.html

https://cloudinary.com/documentation/rails_activestorage

# アプリの作成

“`
$ rails new text_strage_app
$ rails g scaffold Post title:string
$ rails db:migrate
“`

# Active St

[py2rb] 多重継承の6

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 多重継承 (Python)
https://qiita.com/superrino130/items/a62568fe730f6ae04c09

前回の記事のコメントにて、@Nabetani さんより`Ruby3.1`では**クラス変数のオーバーライドがエラー**になることを教えていただきました。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html
> 親クラスに、子クラスで既に定義されている同名のクラス変数を追加した場合、子クラスが、そのクラス変数を参照した際に例外 RuntimeError が発生します。

また、クラス変数について興味深い記事を投稿されています。

https://qiita.com/Nabetani/items/bbd7fc95a9f006ab9136
# 失敗(Ruby)
“`ruby
module Base
def __init__
@name = ‘Base’

includesを使ってSQLの発行件数を減らそう(N+1問題)

## SQLの発行件数が多いと指摘を受ける。

業務にて、ある一覧画面を作成していたところ、
自分が書いたソースをみた先輩から、
「この一覧画面のSQLの発行件数が多すぎる。ちょっと減らしてみて。」とご指摘を受けました。

SQLの発行件数が多いのはN+1問題が起きていたことが原因で、
includesを使用することで
事象を解決できたのでアウトプットしてみようと思います。

## N+1問題とは
必要以上にSQLが実行されて、パフォーマンスが低下する問題。
今回指摘を受けた画面では、
ログを見ると、他のテーブルの情報を取得するため何度もSQLが発行されていました。

## includesとは

includesメソッドは、関連している複数のテーブルからデータをあらかじめ取得するメソッドです。

N+1問題を解決させるためには、
都度SQLを発行させるのではなく、あらかじめデータをすべて取得しておくことで解決することができます。

例えば、
UserクラスとPostクラスがあって、
投稿からユーザ名を取得する処理があったとします。

“`rb
# models/user.rb
cl

クラス変数の持ち主

# これは何?

クラス変数の持ち主が、 python と ruby で違うことに気がついたので、他の言語どうなってるんだろと思って調査したのでその記録。ジェネリクスとテンプレートを交えながら。

# ruby の場合

“`ruby:ruby
class B
def set_v(x); @@v=x; end
def v(); @@v; end
end

class C < B;end class D < B;end c = C.new.set_v("C#set_v") d = D.new.set_v("D#set_v") p [ C.new.v, D.new.v ] #=> [“D#set_v”, “D#set_v”]
“`

クラス変数 `@@v` の持ち主は、 `class B` 。

`C` 経由で変更しても、 `D` から見た `@@v` の値が変わる。

# Python3 の場合

“`python:python3
class B:
v = “in-class-def”
@classmethod
def setV(cls,

【Rails】ログイン機能をGem ‘devise’で実装

こんにちは。
早く駆け出したい修行僧です。

今回は、Gemの ‘devise’ を使ったログイン機能を学んだので、
こちらにアウトプットさせていただきます。

尚、「それは違うよ」など訂正箇所がございましたら、
愛のあるご指摘を頂けたら幸いです。

# 環境
macOS Monterey(M1) 12.2.1
ruby 3.1.0
Rails 6.1.4.6
devise 4.8.1

# ‘devise’とは
特定のページを閲覧したりユーザに制限をかけたりするためには**ログイン認証**が必要となってきます。ログイン認証とはログインやログアウトの機能を指します。
そして、それらは新規登録をしないと始まりません。そんな機能を簡単に実装してくれる優れたgemが ‘devise’ です。

# インストール
`rails new` でアプリ作成済みであることを前提とします。
まずは導入したいアプリケーションのGemfileに以下のコードを挿入します。

“`ruby:G

[AtCoder 初心者] Rubyで競プロ!!! 標準入力

# はじめに #
AtCoderを始めたので、自分用の整理、メモとして投稿します。
間違えている箇所があれば指摘して下さると幸いです!!!!!!!!!!!!

# 1つの要素を取得 #

“`ruby:test.rb
A = gets.chomp
p A
“`
例: 1を入力

“`
-標準入力-
1
“`

“`
-出力-
“1”
“`

・chompメソッドは文字列末尾の改行文字 \n を削除するメソッド。
・getsメソッドで入力した値は、文字列(Stringクラス)で返される。**数値(Integerクラス)として扱いたい場合は、to_iメソッドを使う。** to_iメソッドは **「整数と見なせない文字があればそこまでを変換対象とする」** ため、改行文字 \n は変換対象になる。ゆえに、chompメソッドは不要。

“`ruby:test.rb
A = gets.to_i
B = gets

p A
p B
“`

例: Aに1、Bに2を入力

“`
-標準入力-
1
2
“`

“`
-出力-
1
“2\n”
“`

# 1行の複数の要素を取得