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

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

AWS(S3)に画像をアップロードする

# はじめに
AWS(S3)に画像データを保存する必要性や手順をまとめたいと思います。
現状、herokuを用いてアプリのアップロードを行なっていますが、アップロードされた画像はアプリケーションのディレクトリに保存されていました。
しかし、ユーザーがアップロードした画像データは、アプリがデプロイまたは再起動(24時間に1回自動で行われる)される度に、消えてしまう仕様になっています。
そこで、ストレージサービス(画像等の膨大になるであろうデータを別途保管できる場所、サービスのこと)を利用することで、画像を長期的に保存することができるようになります。
ストレージサービスには様々な種類がありますが、今回はAWSが提供しているS3というサービスを使用します。

## S3(Amazon Simple Storage Service)とは
S3とは、AWSが提供するサービスの一つです。
(インターネット上にデータを保存する箱を借りられるサービスであるとイメージをすると良い。)
S3を利用することで、画像を保存したり、保存してある画像を取得したりすることができます。
S3に保存されたデータは実在の

元記事を表示

Rubyの繰り返し処理の速さをベンチマークで調べてみた

# はじめに
Rubyの繰り返し処理の速さが気になったのでベンチマークで調べてみました。
whileを使うと速いと聞いたので、他の繰り返し処理も使い、実際に検証してみました。
Rubyのモジュールとして提供されているBenchmarkを使用してプログラム実行時のCPU処理にかかった時間を知ることができます。

# 繰り返す内容

1から3,000,000までの範囲の数値を加算していきます。
つまり↓のようになります
1 + 2 + 3 + 4 ・・・・・ 2999998 + 2999999 + 3000000 = 4,500,001,500,000
# コード
“`
require ‘benchmark’

Benchmark.benchmark(Benchmark::CAPTION, 10, Benchmark::FORMAT) do |x|
x.report(“each: “) {
counter = 0
[*1..3000000].each do |i|
counter += i
end
}

x.re

元記事を表示

【Ruby ブロック引数】メソッド.(&block)の引数の「&」ってなに?

# はじめに
“`
def block_execute(&block) # ← ここの引数の「&」の意味がわからない
puts “block.call”
end

block_execute do
puts “blockを実行”
end
“`
def block_execute(&block)
これを見て、(&block)ってどんな引数だよ!!

と思ったので調べました。

# 結論
(&block)の「&」がついた引数は、ブロック引数と呼ばれるものです。

# 解説
ブロック引数の前にブロックとは何か?

### ブロックとは?
メソッド実行時に、そのメソッドの引数として渡せる「処理のかたまり」のこと。
今回で言うとここ↓
“`
block_execute do
puts “blockを実行”
end

または、
block_execute { puts “blockを実行” }
“`

ブロックは
* do ~ end で囲まれた処理のかたまり
* {} で書くことも可能
* メソッドに渡すためだけに存在する

### ブロック引数とは?
ブロックを受け取る専

元記事を表示

kaminariを使ったページネーションの作り方

## 初めに
Gemfileに下記のkaminariを追加してあげます。
追加したらbundle installを忘れないようにしましょう。

“`
gem ‘kaminari’,’~> 1.2.1′
“`
“`
$ bundle install
“`
bundle installをしたら次にkaminariの設定ファイルを作成する為に下記のコマンドをターミナルに打ち込みます。
“`
$ rails g kaminari:config
“`
最後に、kaminariが利用するテンプレートを作成してあげます。
“`
$ rails g kaminari:views default
“`
これでひとまず準備は完了です。

## 次にControllerに記述
例としてindexで記述しています。
“`app/controllers/books_controller.rb
def index
@books = Book.page(params[:page]).per(9)
end
“`
上記のようにpage(params[:page]).per(9)を付け足してあ

元記事を表示

【備忘録】【Rails】initializeメソッドの使い方

自分用のメモです。

# initializeメソッドとは(一言で)

– コンストラクタのこと。

# コンストラクタとは
– オブジェクトを生成した際に1度だけ実行される機能を指す名称。
– なお、オブジェクトが生成された際にのみ実行されることから、そのオブジェクト内で共通に使えるインスタンス変数の初期化などに使われる。
– ただしクラスを定義した際、コンストラクタを必ず作る必要はない。
– コンストラクタが定義されていなくてもオブジェクトを生成できる。
– また、Rubyではオブジェクトを生成するnewメソッドの引数を利用して、コンストラクタによる変数の初期化も可能。

# initializeメソッドの特徴

– initializeメソッドを定義しておくと、インスタンス生成時に必ず実行したい処理をメソッドを呼び出すことなく実行することができる。
– 例えば次の例では、initializeメソッドの中でインスタンス変数の初期化を行っている。

“`ruby:
class Car
def initialize()
@name = “未定義”
end
end

c

元記事を表示

【備忘録】【Rails】クラスメソッドとインスタンスメソッドの違い

クラスメソッドとインスタンスメソッドの違いについて、曖昧な理解だったため、今回改めて勉強しました。

# クラスメソッドの特徴

– クラス内で def self.メソッド名 〜 end で定義する
– クラスから直接データを呼び出すことができる
– あるモデルクラス全体に対し、情報を変更したり、参照したりするメソッドを作成するときに使うと便利
– 例えば「User」クラスを作成した場合を例にするなら、ユーザー一覧の表示や、ユーザー全体で共有して使うステータスを更新するメソッドを作成するときに使うと良い。

“`ruby:def self.method_name での書き方
class Hoge
def self.hoge
puts “hoge”
end
end
Hoge.hoge # => hoge

# selfはHogeでもOK
“`

“`ruby:class << self 内でクラスメソッドを定義する書き方 class Hoge class << self def hoge puts "hoge" end end

元記事を表示

【Ruby】論理演算子(&&、||)の短絡評価を本質から理解する

# 1. はじめに

プログラムのソースコードで、しばしば以下のように`&&`で連結された処理を目にします。
“`rb
user && user.authenticate(params[:session][:password])
“`

この処理を読み解くと、「`user`が存在する時のみ、`user`の`authenticate`メソッドを実行する」と捉えられます。
これと同様に、`&&`と`||`は次のような使われ方をすることがあります。

“`rb
条件式1 && 条件式2 #=> 条件式1がtrueの時だけ、条件式2を実行する
条件式1 || 条件式2 #=> 条件式1がfalseの時だけ、条件式2を実行する
“`

では、なぜこのような挙動をするのか、原理を説明することはできるでしょうか?
「短絡評価」という名前や、コードの実行結果だけを暗記していて、原理はよくわからない、なんてことはありませんか?

実際、[Rubyの公式ドキュメントの論理演算子の項目](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator

元記事を表示

【備忘録】【Rails】new + save と create の違い

どちらもレコードをつくるときのメソッドですが、何が違うのだろうと疑問に思ったので調べました。

# new + save を使うべき場合

### ①コントローラー内で、条件分岐させたいとき

例えばArticleモデルでバリデーションの設定をしていて、
保存時にバリデーションを適用させたいときにはif文等で条件分岐の記述をしますが、
その場合は以下のようにnew + save メソッドを使います。
理由:createメソッドでは、たとえ保存に失敗してもオブジェクトを返すためif文がtrueとなり成功時の処理を行ってしまうからです。

“`ruby:
def create
@article = Article.new(article_params)
if @article.save
redirect_to(“該当パス”)
else
flash.now[:alert] = ‘文字を入力してください。’
render :index
end
end
“`

### ②view側で使いたいとき

例えば Book モデルを

元記事を表示

bundlerをアップグレードする

## 環境
Ubuntu20.4
Ruby2.6
gem 3.0.1

## bundlerのバージョンを確認
ローカルにインストールされてるbundlerのバージョンを確認します。下記3コマンドのどの方法でも確認できます。ちなみに、自分の環境のバージョンは1.17.2です。
“`
$bundle -v
$gem info bundler
$gem list | grep bundler
“`

>コマンドはbundleだが、gemの名前はbundlerです。

リモートリポジトリに上がっているbundlerの最新バージョンを確認します。下記3コマンドのどの方法でも確認できます。最新のバージョンは2.3.25でした。(2022/11/3 時点)

パイプでheadに渡しているのには理由があります。^bundlerだけでgrepすると、bundlerで始まるgemがわりと多く存在するため、たくさんのgemが一覧表示されます。表示件数を絞り込むためにheadをしています。
“`
$gem info -r bundler
$gem list -r | grep ^bundelr | h

元記事を表示

Bundle installでmysql2がインストールできない

### Bundle installでmysql2がインストールできない

“`
$ bundle install

(省略)

An error occurred while installing mysql2(0.5.3), and Bundle cannot continue.
Make sure that `gem intall mysql2 -v ‘0.5.3’ –source ‘https://rubygems.org/’`

In Gemfile:
mysql2
“`

ログに吐かれたエラー文を確認

“`
directory not found for option ‘-L/usr/local/opt/openssl/lib’
“`

lsでディレクトリの確認
“`
$ ls /usr/local/opt/openssl/lib
“`
ディレクトリが存在しないことがわかった。

brew install openssl で opensslのパスを確認

“`
==> openssl@3:stable 3.0.7(bottled)[keg-only]
Cr

元記事を表示

バージョン指定の `~>` の別名 twiddle-wakka の由来

# `~>` の別名
Gemfile や gemspec でバージョン指定に使う `~>` には複数の別名がある。

https://qiita.com/tbpgr/items/e892fd9536d187f7c220

> – pessimistic comparison operator
> – twiddle-wakka
> – approximate
> – spermy
>
> ググってみると `pessimistic (comparison) operator` と呼んでいる人が多い。
RubyGemsのドキュメントでは `twiddle-wakka` になっている。
RubyGemsのソースコードでは `approximate` になっている。
`approximate` に変更する前は `spermy` になっていた。名前が微妙なので変えたようだ。
まぁ、たしかに見た目は・・・いや、しかし・・・。

pessimistic, approximate は意味を考えれば納得だし、 spermy はひどい名前ではあるが、見た目がたしかに似ているからわかる。

元記事を表示

Active Recordのjoinsメソッドで複数テーブルを結合する

## これは何?

[Railsガイド](https://railsguides.jp/)の[Active Record クエリインターフェイス / 13.1.3 複数の関連付けを結合する](https://railsguides.jp/active_record_querying.html#%E8%A4%87%E6%95%B0%E3%81%AE%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B)を読んでいて、`joinsメソッド`で`配列とハッシュをどのように使えばいいか深く知りたくなった`ので、いくつかのテーブル構成で実際に試し、結果をまとめた記事です。

## 対象バージョン

– ruby: `2.7.6`
– rails: `7.0.3.1`

## joinsメソッド内のルール

①複数のテーブルを結合する場合は、配列`[]`にする
②親テーブルに対して複数のテーブルを結合する場合は、配列`[]`を省略できる
③ネストして結合する場合は、ハッシュ`{}`にする

元記事を表示

privateメソッドはクラスメソッドで使えない理由から学んだことメモ

# コード例

“`ruby
class Hoge

def self.xxx
yyy
end

private

def yyy
‘呼んだ?’
end
end
“`

“`ruby
Hoge.xxx
=> NameError: undefined local variable or method `yyy’ for Hoge:Class
“`

# 原因
– スコープの違い
– カレントオブジェクトが異なるため、そんなメソッドないよと言われてしまう

## privateメソッドとは
「self以外のレシーバを指定して呼び出すことができないメソッド」(Ruby2.7以降)
self以外のレシーバが指定できない = **外部から呼び出しされることがない**メソッド

しかし、レシーバが指定できないだけでそれ以外はpublicメソッドと変わらない。
そのため、スーパークラスのprivateメソッドをサブクラスで使用することは可能。(レシーバの指定をしなくてもメソッドが呼び出されるから)

“`ruby
class Hoge

private

元記事を表示

form_withで送信ボタンを押しても動かないとき(同期通信)

備忘録。
form_withで送信ボタンを作成したとき、ページの更新を行なうとテーブルに情報が残るし、けど更新しないとエラーもでないのに固まったままだった。
“`ruby

<% if user_signed_in? %>
<%= form_with model: [@item, @comment],local: true, id: "comment-form" do |f| %>
<%= f.text_area :text , class: "comment-text"%>
<%= f.submit "コメントをする", class: "comment-submit" %>
<% end %>
<% end %>

<コメント一覧>

<% @item.comments.each do |comment| %>

元記事を表示

フラッシュメッセージの日本語化

## はじめに
フラッシュメッセージの日本語化について自分自身戸惑ってしまった事があったので記録して残しておきます。

## 日本語の言語設定
config.i18n.default_locale = :jaをapplication.rb追加します。

“`ruby:config/application.rb
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.1 config.i18n.default_locale = :ja end end ``` ## Gemfileの追加 Gemfileに'rails-i18n'を追加します。 ```ruby:Gemfile gem 'rails-i18n' ``` bundle installを忘れないように! ## 日本語化ファイル作成 下記の物に書いてある文章に応じて日本語化され

元記事を表示

フリマアプリにコメント機能の追加実装をする ※コメントが保存されないエラーが出続けた話。

フリマアプリ作成が一段落して、追加の実装としてコメント機能の実装に取り組みます。
itemsコントローラー
“`ruby
before_action :set_item, only: [:edit, :show,:update]
def show
@user = @item.user
@comment = Comment.new
@comments = @item.comments.includes(:user)

end
private
def set_item
@item = Item.find(params[:id])
end
“`
commentsコントローラー
“`ruby
class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) if @comment.save redirect_to item_path(params[:item_id])

元記事を表示

【Rails】Railsチュートリアルのseeds.rbをリファクタリングする

# 目的
Railsチュートリアルにて、`seeds.rb`を用いて任意の数のユーザーとそれに対するマイクロポストの作成をおこないました。
先輩エンジニアに見てもらうと「リファクタリングできるよ〜」とのことだったので、その方法をまとめます。

# 何が問題なのか?
まずは`create`メソッドの使い方をおさらいします。
例として今、`number`というキーをもつ`Number`モデルから、インスタンスを5つ作成することにします。

“`ruby: レベル1
Number.create!(number: 1)
Number.create!(number: 2)
Number.create!(number: 3)
Number.create!(number: 4)
Number.create!(number: 5)
“`
毎回`Number.create!`を実行するパターンです。
この方法では`create!`メソッドを5回おこなっていることになります。
`create!`メソッドは実行するとSQL文を発行し、DBへアクセスします。
つまりこの方法では5回DBにアクセスし、それだ

元記事を表示

[rails 初心者]同率順位を踏まえたランキング機能(修正版)

初めに

前回作成したランキング機能にて、**1点だけ**動作不備が見つかりました。
今回はそのバグを解消する記事になります。
(因みに前回の記事をまだ読んでいないという方は、前提条件のところにリンクがあるので
よかったら読んでみて下さい!!)

前提条件

`前回までの記事`が一通り終了していること(因みに次の3つです)
①**レビューの基本** = 評価関係の処理についてまとめた記事です
②**レビュー機能+@(応用)** = 「評価点の`平均値化`」と「その平均値順に`並び替え`」を行いました
③**ランキング機能の追加** = `同率順位を考慮したランキング機能`を実装しました。

リンクはこちら

[[rails初心者]複数権限でのログインを使ったレビューサイトの作成(基本)](https://qiita.com/about10/items/0e376c84022f2ac238d0)
[[rails初心者]複数権限でのログインを使ったレビューサイトの作成(応用)](https://qiita

元記事を表示

本番環境で画像などを上手く反映する方法

開発環境では画像は表示されるが、本番環境では画像表示されない初歩的なミス

## 状態
開発環境では画像は表示されるのに本番環境にgit pullをすると画像などが反映されない問題

## 順序
“`rb
git pull origin main
“`
ここで勝手に本番環境で反映されるものだと思っていましたが本番環境には変更を取り込んだだけで、動作させるアプリケーションには反映されないそうです。

“`rb
bundle exec rails assets:precompile RAILS_ENV=production
“`
この一文を打ち込んであげる事で無事に反映されました。
とても初歩的なミスかもしれませんが慣れないデプロイでの作業であったので今後の教訓の為に残しておきます。

最後に補足としてCSSやJavaScriptを開発環境で追加した際にも上記に記載されているコードで本番環境に反映する事が出来るので是非試してみてください。

元記事を表示

Flyデプロイエラー解決編(Windows)

今回はfly.ioのエラー解決に向けての記事です!

## ①yarnについてのエラー解決
Dockerfileの25行目付近を以下のコードを追加
“`ruby:Dockerfile
ARG NODE_VERSION=16.14.0
ARG YARN_VERSION=1.22.17 #追加コード
ARG BUNDLER_VERSION=2.2.32
“`
同じくDockerfileの48行目付近を以下のコードに変更
“`ruby:Dockerfile
#変更前
RUN volta install node@${NODE_VERSION} yarn
#変更後
RUN volta install node@${NODE_VERSION} yarn@${YARN_VERSION}
“`

元記事を表示

OTHERカテゴリの最新記事