Ruby関連のことを調べてみた

Ruby関連のことを調べてみた

【Ruby,Rails】長いメソッド名をわかりやすい名前に変えて使用してみよう

どうもこんにちは。

今回は、Ruby,Railsでメソッド名を自分のわかりやすい名前に変更して使用する方法を紹介します。

# メソッド名を変更して使用する方法

大きく分けて2つです。

1. `alias`や`alias_method`を使用する
1. 独自のメソッド名変更メソッドを用意する

ただし、`alias`や`alias_method`は全てのメソッドに対して使用できる訳ではありません。
以下のメソッドに対して`alias`や`alias_method`を使用することができます。

1. **明示的に定義されたメソッド**: クラス内で明示的に定義されたインスタンスメソッドやクラスメソッドには、通常、エイリアスを定義することができます
1. **継承されたメソッド**: スーパークラスから継承されたメソッドに対してもエイリアスを定義することが可能です

一方で`alias`や`alias_method`を使用できないメソッドは以下のようなものです。

1. **動的に生成されるメソッド**: メタプログラミング技術やフレームワークの内部機構によって動的に生成されるメソッ

元記事を表示

Rubyの並列化で激オソご注意!!

ローカル環境で高速だった処理が本番環境で激オソになる目にあいましたので共有です。

## 結論
Rubyで処理速度を向上させるために、Parallel gemの Parallel.map を使ってスレッド並列化を試みたものの、ローカル環境では問題なかったのに本番環境で劇的に遅くなってしまった経験はありませんか?

実は、Parallel.map はデフォルトでプロセス並列化を行うため、アクセス数の多い本番環境ではプロセスの立ち上げコストが大きな負荷となり、処理速度が低下してしまう可能性があります。

スレッド並列化で3分→3秒!本番環境で劇的な速度向上を実現

この記事では、Parallel.map によるプロセス並列化の落とし穴と、in_threads によるスレッド並列化で3分→3秒という劇的な速度向上を実現した体験談をご紹介します。

## Parallel.mapによるプロセス並列化の落とし穴

ローカル環境では、Parallel.map を使用して4つのスレッドで処理を行ったところ、処理時間は約30秒と高速でした。しかし、本番環境では2つのコアに対して4つのプロセスを立ち上げ

元記事を表示

アソシエーションのthrough, sourceオプションを図として理解する。

# きっかけ
Railsを使って掲示板をブックマークする機能を実装する勉強中、中間テーブルを絡めたアソシエーションの理解に苦しんだ。
特に、後述の`bookmarked_boards.destroy(board)`と、`bookmark.destroy(bookmark)`が同じ意味であることのイメージができなかった。
図としてイメージをすることでさらに理解を定着させたい。

:::note warn
※部分は独自の解釈が含まれるので、間違いであればご指摘いただけると幸いです。
:::

# 環境
ruby 3.14
rails 7.0.3.1
mac OS Sonoma 14.2.1
docker 24.0.7
docker compose v2.23.3-desktop.2

# したいこと
* 多対多のアソシエーションにおけるthroughオプションと、sourceオプションを理解する。
* `bookmarked_boards.destroy(board)`と`bookmarks.destroy(bookmark)`が何故同じ結果になるのかを図で理解する。

# 今回のポイン

元記事を表示

【Ruby on Rails】rails g コマンドが反応しないことに関して

現在スクールで学んでいます。
Ruby on Rails学習中に新たにアプリ作成しようとした際に、つまづいたことを備忘録としてこちらで共有します。追記や修正等ありましたら、ご指摘いただけるとありがたいです。

### 環境
・MacBookAir 13インチ M1(2020)
・OS:Sonoma 14.3
・メモリ:16GB
・Rails: version 6.1.7.6

### 概要
 Ruby on RailではControllerやModelを新規で作成する際に、コマンドから簡単に作成することが出来ます。その際にrails g または、rails generateというコマンドをターミナル上で実行します。

### 状況

“`zsh
$ rails g model post title:string content:text
Running via Spring preloader in process 82269
invoke active_record
create db/migrate/20240208095330_

元記事を表示

【Rails】データの状態遷移をわかりやすく定義できるGem「AASM」

どうもこんにちは。

コード理解を進めている中でAASMというライブラリが何者なのか知る必要がありそうなので、調べてみました。

# AASMについて

ChatGPTに聞いてみたところ、以下のような返答が返ってきました。

> `AASM(Acts As State Machine)`は、オブジェクトの状態を管理し、状態間の遷移を定義するためのRubyライブラリです。このライブラリを使用すると、モデルの状態遷移を宣言的に記述でき、コールバックや条件付き遷移などの高度な機能を利用することができます。

ちょっとよくわからなかったですが、よく調べてみると、
**データの状態を変更する前と後で明示的に処理を分けることができてメソッド化できる**ライブラリということです。

これは実際にコードを書いて理解するのがわかりやすそうです。

## modelを用意

以下のようにテーブル,モデルを用意します。

contentsテーブル
| カラム名 | 型 |
| — | — |
| id | integer |
| title | string |
| status | integer

元記事を表示

エンジニア学習日記

Ruby基礎
https://note.com/takane_konbu/n/n282f98af7110

元記事を表示

Ruby +α メモず

# はじめに
メモ群なので、気になった見出しをご覧ください!
# メモず
## Rubyのファイル名はすべて小文字
例:`my_script.rb`
スネークケースと呼ばれる、「小文字 & `_`」で命名するのが一般的。
これはRailsも同じ。

### 他の言語の命名規則
#### JS:キャメルケース / ケバブケース
例:`myScript.js` / `my-script.js`

#### Java:パスカルケース
例:`MyClass.java`

## 複数行コメントアウト
=begin から =endまで
ただし、インデントすることができない(らしい)
よって、コードの中では`#`を使うのが一般的で、
=begin / =endはドキュメントコメントとして使用されることが多い。


“`rb
def my_method
p “Hello, World”
=begin
ここがコメント
複数行でも大丈夫
インデントはできない
=end
# あるいは、これがコメント
# これもコメント
end
“`

## irb 1行ずつ実行(デバック・簡易試行)
`irb

元記事を表示

VSCode + Docker + Docker-compose +Railsのデバッグの設定方法

# 概要
`Dev container`の環境を作らず、ステップ実行でデバッグが出来る環境を作成しました。今回は、その方法を記載します。

# 事前設定
以下がインストールされている事が前提です。
– **Docker Desktop**
– **Visual Studio Code**
– **VSCode rdbg Ruby Debugger**

# ディレクトリー構成
“`sh
.
├── db/
│ ├── conf/
│ │ └── .env   
│ └── postgres_volume # ← コンテナー起動時に自動生成
├── web/
│ ├── vscode/
│ │ └── lanuch.json
│ ├── # rails関連のファイル
│ ├── Dockerfile
│ ├── Gemfile
│ └── Gemfile.lock
└── compose.yml
“`

# 環境構築
– `Dockerfile`の構成は下記
“`Dockerfile
FROM ruby:3.2.2
ENV LANG=ja

元記事を表示

Ubuntu 22.04 で Rails 4.2 を動かすには?

あるRailsアプリケーションを8年ぶりに動かそうとしています。
実行環境は、WSL上の Ubuntu 22.04 です。動かせるでしょうか?

8年前は2016年、Rails 5.0 がリリースされた年です。
残念ながら、このアプリケーションのRailsのバージョンは`5.0`ではなく、`4.2`でした。
Rails 4.2 がサポートしているRubyのバージョンは`2.2`です。

## 問題

Ubuntu 22.04 では Ruby 2.2 が動きません。正確には `gem install` できません。
実行すると次のエラーが出ます。

“`sh
►gem install bundler
ERROR: While executing gem … (RuntimeError)
Marshal.load reentered at marshal_load
“`

実行したときに、このエラーが出ずにsegmentation faultすることもあります。

Ruby 2.2には`bundler`が含まれません。
`gem install`できないと`bundle

元記事を表示

rbenvでRuby 3.2.2をinstall するとBUILD FAILEDになる

## 環境
– macOS Monterey 12.6.2
– rbenv 1.2.0
– Homebrew 3.4.7
## rbenv を使ってRubyをinstallすると失敗する。
Ruby3.2.2をインストールしようとすると、以下のようにエラーが発生してビルドが失敗してしまうので、解決のために実施したことのメモになります。

“`
$ rbenv install 3.2.2
BUILD FAILED (macOS 12.6.2 using ruby-build 20230717)
“`

## 対応
最初に環境構築をしてから、しばらくソフトウェアのアップデートなどしてこなかったので、今回関係ありそうなツールのアップデートから始めました。
– Homebrew, ruby-buildの更新
“`
$ brew update
$ brew upgrade ruby-build
$ brew upgrade rbenv
“`
上記コマンド実行後、再びインストールを試しましたが、解決しませんでしたので続きます。
– opensslのアップデート [参照](https://g

元記事を表示

【Rails】CSV出力機能を簡単に作成する

## はじめに
Railsでモデル(Item)のデータを取得しcsv出力する機能を作成する

## 環境
`ruby 2.7.2p137`
`Rails 6.0.3.4`

## コンロトーラー
~~~ruby:app/controllers/items_controller.rb
require ‘csv’

def export_csv
items = Item.all # 出力したいデータと取得します
headers = [‘id’, ‘name’]
data = CSV.generate do |csv|
csv << headers # 1行目ヘッダーになるため、項目をheadersに代入して初めにcsvに書き込みます。 items.each do |item| csv << [item.id, item.name] # 1行目にヘッダーを書き込み終えたら、2行目以降はitemsをループ処理で書き込んでいきます。この時ヘッダーの項目と出力する値が乖離しないように同じ順番にしています。 end end send_data

元記事を表示

Ruby + Goで魔法のスプレッドシートの更新を通知するSlackAppを作ってみた

## はじめに
IT企業のインターン情報が多数掲載されている[魔法のスプレッドシート](https://magic-spreadsheets.pages.dev)ですが、新しい募集が掲載されても変更の通知を受け取ったり差分を確認する機能がないため、優秀な人材と企業がマッチする機会が損なわれるという課題を感じていました。

そこで今回は、魔法のスプレッドシートが更新されたときにSlackに通知を流すSlackAppを作ってみました。

完成したコードはGithubで公開しているので参考程度にどうぞ。

https://github.com/piny940/magic-spreadsheet-notifier

SlackAppはこちらのサイトから追加できるようにしました。

https://magic-spreadsheet-notifier.piny940.com

## 技術選定

今回作るSlackAppの動作は写真のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3

元記事を表示

【Rails】has_manyでオートセーブが設定できるのは便利

どうもこんにちは。

今回は、モデル同士の関連付けを定義する時によく使用される`has_many`での便利なオプション`autosave: true`についてメモします。

以降は、以下の記事の知識(`build`メソッド)を使用しています。

https://qiita.com/PDC-Kurashinak/private/413059bf52c7ab14ed16

## has_manyってなに?

`has_many`とは、モデル同士を関連付けるために`belongs_to`と一緒に使用するものです。

UserモデルにPostモデルが子として紐づいていることを定義したい場合は、以下のように定義します。

“`ruby
# Userモデル
class User < ApplicationRecord has_many :posts end # Postモデル class Post < ApplicationRecord belongs_to :user end ``` has_manyにはオプションがいくつかあり、最も使用されるものは`dependent:

元記事を表示

【Rails】ActiveRecord::Base.transactionについて

どうもこんにちは。

今回はRailsでDB操作をする時に便利な`ActiveRecord::Base.transaction`についてメモします。

# トランザクションって何?

トランザクションをネットで検索すると、**「ここからここまでワンセット」な処理単位が「トランザクション」** というわかりやすく説明してありました。

まさにその通りです。

この考えをDBの操作でも活用しているものがRailsにおけるトランザクションです。

# 使い方

基本的に、データの登録、更新、削除する時のメソッドとして使われます。

`ActiveRecord::Base.transaction do … end`ブロックでsaveメソッドやupdateメソッド処理の箇所を囲うようにして使用します。

“`ruby
def create
## データを登録するためのデータを作成
user = User.find(params[:id])
profile = Profile.new(user_id: user.id, hobby: ‘野球をすること’, favori

元記事を表示

【Rails】Rspecで500エラーが出る

# はじめに
この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。その場合はご指摘いただけると幸いです。

# 起こった問題
Solidusを使用してECサイトを作成中、Rspec(リクエストスペック)を実行したところ500エラーが返ってきた

# 結論
テストに使用しない場合でもviewで使用しているデータはテストデータとして作成しておく

# 解決までの道のり
### 前提条件
– Solidusに予め用意されているテストデータを使用
– viewには商品カテゴリーのパンくずリスト、商品画像、商品名、金額を表示

### 発生したエラー
スペックファイルは下記のように記述
“`spec/requests/product_spec.rb
require ‘rails_helper’

RSpec,describe “Products”, type: : request do
describe “GET /products” do
let!(:product) { create(:

元記事を表示

Railsでログインを押すとログアウトに表示を変更する方法

## Railsでログインを押すとログアウトに表示を変更する方法

今回はRuby on Railsでログイン機能を実装します!
ログイン機能を実装しようとすると、ログイン・ログアウト・新規登録のボタンが3つできるかもしれません。今回は3つできるボタンを2つで実装し、ログインボタンを押したらログアウトと表示できるようにしていきたいと思います!(イメージは以下の動画です)
![ログイン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687617/30d26900-51b4-51bb-0646-223227b9db92.gif)

:::note warn
注意
この記事は、すでにログイン・ログアウト・新規登録の実装ができていることを前提に書いています。
:::

### 目次
1.View周り
2.コントローラー設計
3.ルート周り

## View周り
まず、ビューページのどこかに以下のようにログイン・ログアウト・新規登録のボタンを実装しているかもしれません。

“`ruby:tweets/i

元記事を表示

Devise 使用 Rails アプリで、パスワード変更機能をユーザー情報編集から分離➡パスワードリセットと統合してみた話

## 概要(やってみたこと)

1. ユーザー編集画面で、パスワードとそれ以外の属性の編集画面を別々にする
1. パスワード**以外**の編集時は確定時のパスワード再入力を不要とする
1. パスワード変更画面/処理はパスワードリセットのView/Actionと共用にしてパスワード変更処理を一つにする

末筆の通りあまりお行儀は良くない気がするので、コードの量より分かりやすさが重要な状況(大規模プロジェクトetc.)には向かないと思います。
コード量抑制を重視する状況下では使いどころもあるかもしれませんが、こんなやり方もできたという一種の頭の体操的に捉えて頂けますと幸いです🙏

なお前提として、本稿内では Devise の認証対象のモデルは「`User`」としています。
モデル名が異なる場合は適宜読み替えてください。

## ソース・環境

ソース全文・全履歴は下記になります。なるべく対応内容ごとの変化が分かりやすいようにコミット単位も調整しました。

https://github.com/k-yamauchi-1/passwords_edit_with_devise

ローカル環境は

元記事を表示

【Rails】意図していないアクションが実行されてしまう時に確認してほしいこと

## はじめに
Railsでアプリ開発をしていて、意図通りにアクションが実行されないことはよくあると思います。
その原因は様々あると思いますが、今回は未来の自分の為にいくつか例を投稿します。
ついでに初学者の方々の助けにもなれば幸いです。

## ルーティングの記述の順番を確認する。
Railsのルーティングは、ルートの定義順によって評価されます。
つまり、最初にマッチしたものが実行されます。
以下の場合`item_export_list_path`をリクエストすると
`item#export_list`ではなく`item#show`が実行されてしまいます。
~~~ruby:config/routes.rb
post ‘items/:id’, to: ‘item#show’, as: ‘items_show’
post ‘items/item_list’, to: ‘item#export_list’, as: ‘item_export_list’
~~~
なので以下のように順番を入れ替えて修正
~~~ruby:config/routes.rb
post ‘items/item_lis

元記事を表示

dockerコンテナ内でrails dbconsoleが使えないエラーが出た時の対処法

**概要**
—————————————

DBコンソールを起動しようとDockerコンテナ内で以下コマンドを実行したが,エラーが発生。

“`
# rails db
Couldn’t find database client: psql. Check your $PATH and try again.
“`

rails dbコマンドを実行したときにPostgreSQLのクライアントであるpsqlが見つからないときに表示されるとのこと。
Dockerfileを訂正し,PostgreSQLをインストールする必要がある。

**解決策**
——————————————–
Dockerfile
“`rb
FROM ruby:3.1.4
RUN curl -sL https://deb.nodesource.com/setup_19.x | bash – \
&& wget –quiet -O – /tmp/pubkey.gpg https://dl.yarnpkg.

元記事を表示

【Rails】destroyではなくshowが実行される

# はじめに
この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。
その場合はご指摘いただけると幸いです。

# 起こった問題
スクールのカリキュラムでX(旧Twitter)のような短文投稿サイトを作成した際、destroyアクションを実装して投稿の削除ボタンを作成したが、showアクションが実行されてしまった

# 結論
RubyのコードではなくJavaScriptの問題の可能性があるためコンソールを確認してみる

# 試したこと①
元の記述(これだとdestroyできない)
“`
<%= link_to "削除", user, method: :delete, data: { confirm: "本当に削除しますか?" } %>
“`
この記述で作成した削除リンクをクリックするとshowアクションに飛んでしまいました。
特にエラーが表示されるわけでもありません。
調べたところ、link_toをbutton_toに変更すると解決する場合があるとのことだったので試してみました。
“`
<

元記事を表示

OTHERカテゴリの最新記事