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

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

VBのWith…End With ステートメントをRubyで実現するには

## 環境
Ruby2.6

## はじめに
Rubyを触っていて、その昔、VBでよく使っていた**With…End With ステートメント**が、Rubyでも使えないものだろうかと思いググってみました。

Rubyではどうも、**instance_execメソッド**を使って実現できるらしいです。

VBのWith…End With ステートメントは個人的には、わりと重宝して使っていたにも関わらず、Rubyのinstance_execメソッドについて書かれた記事はあまり散見されないようです。

instance_execメソッドの便利さはあまり認知されていないのだろうか。そこで、instance_execメソッドの便利さについて書いてみました。

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/with-end-with-statement

## メリット

instance_execメソッドを使うと、オブジェクト参照を複数行に渡って記述したいときに、反

元記事を表示

Railsでポリモーフィック関連付けを使用した柔軟なモデル関連付けの実装」

## はじめに
アプリ制作の過程で、ポリモーフィック関連を用いた実装を行いました。ここではその実装過程で得られた気づきをまとめます。ポリモーフィック関連について実際の例を交えながらなるべく分かりやすくまとめたいと思います。

## なぜポリモーフィック関連付けが便利なのか
例えば、ブログ記事にコメントを付ける機能を作ったとします。その後、イベントページにもコメントを付けたくなったとします。通常であれば、新しくコードを書き足さないといけないと思います。しかし、ポリモーフィック関連付けを使うと、既存のコードをほとんど変更せずに、イベントにもコメントを付けられるようになります。
それでは、実際にコードを見ていきましょう。

## モデルの設定
まず、モデルの設定から。`Article`、`Event`、`Comment`の3つのモデルを作ります。
“`ruby
class Article < ApplicationRecord has_many :comments, as: :commentable end class Event < ApplicationRecord has

元記事を表示

【Rails】You need to supply at least one validation エラーが発生したら

## 概要

Rails アプリでフォームデータを送信するとき、以下のようなエラーが発生しました。

“`
You need to supply at least one validation
“`

## 原因

このエラーは以下のように `validates` メソッドにバリデーションの内容が指定されないと発生します。

“`rb
class Profile < ApplicationRecord validates :user_id end ``` ## 対処法 このエラーを解決するためには `validates` メソッドに適切なバリデーションを指定します。例えば `user_id` が一意であることを検証するために `uniqueness: true` オプションを指定できます。以下のようにすると、エラーは解消されます。 ```rb class Profile < ApplicationRecord validates :user_id, uniqueness: true end ``` ## まとめ `validates` メソッドを使用する際は、バ

元記事を表示

【ActiveRecord】length vs size

# 目的
**ActiveRecord**の`length`と`size`について、しっかり理解した上で適切に使いこなせるようにする。
#### 補足
本記事は、レコード数の取得においてSQL文の発行数を抑えることの出来る`length`と`size`にフォーカスしています。
※`count`メソッドは、必ずSQL文を発行するため割愛(比較用で一部記載あり)

# ActiveRecordのlengthとsizeの違い

## `#size`
https://github.com/rails/rails/blob/main/activerecord/lib/active_record/relation.rb#L345-L352
“`rb:rails/activerecord/lib/active_record/relation.rb
# Returns size of the records.
def size
if loaded?
records.length
else
count(:all)
end
end
“`
:::note
– Loadされて

元記事を表示

Railsで共通パーツの一部をページごとに変更する方法

## はじめに

アプリ制作の過程で、ヘッダーの一部を特定のページで戻るボタンに変更するという実装を行いました。
ここではその実装過程で得られた気づきをまとめます。

## 本記事の内容
Railsで共通パーツとして使っているものの一部分を特定のページで変更する方法。

## ヘッダーのView
“`ruby:_header.html.erb

元記事を表示

【初心者向け🔰】CodeWars【学習サイト】

# はじめに

https://www.codewars.com/dashboard

Codewars というサイトをご存知でしょうか
いろんな言語のアルゴリズム問題を解くことができるサイトです。

類似するサイトで有名なものだと「AtCoder」や「Paizaラーニング」があります。

# Codewarsのオススメな点
個人的には、アルゴリズム問題サイトで一番オススメです。

## 時間制限がないから、学習に集中できる

:::note alert
PaizaラーニングやAtCoderは**時間が計測されます**。
また、Paizaラーニングでは**時間制限があります**。
:::

私的な話になりますが、時間が計測されていると集中ができません。

また、
– 「雑に書いても早くしたい」
– 「ミスの可能性とトレードオフに、スピードを求める」

ということが起こります。

これは学習とは真逆です。

また、実際の開発においても不要な考えだと思います。

この点、CodeWarsには**時間制限がない**ため、のびのびと学ぶことができます。

## トライ&エラーできて、学びの効率

元記事を表示

【Ruby】最近発見した便利な記述方法メモ

ここ数日qiitaを巡回していて見つけたRubyで完結に書ける実装方法メモ。
### |
“`ruby
array1 = [“a”, “b”]
array2 = [“b”, “c”, “d”]

array1 | array2
# => [“a”, “b”, “c”, “d”]
“`
配列と配列を結合して1つの配列を返す。
重複する要素は1つにまとめられる。
### &
“`ruby
array1 = [“a”, “b”]
array2 = [“b”, “c”, “d”]

array1 & array2
# => [“b”]
“`
共通する要素のみを取り出して配列として返す。
### array.map(&:method)
“`ruby
array = [“a”,”b”, “c”]
array.map(&:upcase)
# => [“A”, “B”, “C”]

array.map(&: * 2)
# => error
# mrthodじゃないから処理できない
“`
`array.map{|item| item.method}`を簡潔に書くことができる。

元記事を表示

[Rails]あ…ありのまま、今起こった事を話すぜ!「おれはorder(created_at: :asc)と実装したと思ったら、created_at descのSQLが実行されていた」

な… 何を言っているのかわからねーと思うが
おれも 何をされたのか わからなかった…

頭がどうにかなりそうだった…
[reverse_order](https://railsdoc.com/page/model_reverse_order)をチェーンしていただとか超スピードだとか
そんなチャチなもんじゃあ断じてねえ

もっと恐ろしいものの片鱗を味わったぜ…

ということで、前置きはここまでにして実際に私が体験した話です。

タイトルの通り`order(created_at: :asc)`と実装したのに、SQLは`created_at desc`と実行される実装について説明します。

ここまでの話だけで、パッと実装が思い浮かぶ方はActiveRecordマスターだと思います…!
私は10年弱Rails触っていますが、初めて気づきましたw

## 実装

わかってしまえば、やり方は簡単です。
Userというモデルがある場合、下記実装では発行されるSQLのorderは逆になります。

“`ruby
User.order(created_at: :asc).last
“`

`

元記事を表示

Rubyで連分数展開のプログラムを書いてみた

# 連分数とは

**連分数**とは、以下のように分母に分数が含まれているような分数です。ただし、 $a_n$ と $b_n$ は整数です。また、 $b_n$ がすべて $1$ の場合、**正則連分数**と呼ばれます。(この記事では正則連分数のみを対象とするので、以降 「連分数」 と表記したものは正則連分数を指します。)

“`math
x = a_0 + \frac{b_1}{a_1 + \frac{b_2}{a_2 + \frac{b_3}{a_3 + …}}}
“`

上記の $x$ が有理数の場合 $a_n$ は有限ですが、無理数の場合は無限に続きます。例として、黄金数 $\varphi = \frac{1 + \sqrt{5}}{2}$ は以下のように $a_n$ がすべて $1$ で、それが無限に続きます。

“`math
x = 1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{1 + …}}}
“`

# 連分数展開とは

ある数を連分数に変形することを、**連分数展開** と呼びます。小数は以下の手順で連分数展開できます。

元記事を表示

マイグレーションファイルの修正、削除について

## 概要
・マイグレーションの扱いについて
・修正、削除する方法は2つある
・rails db:rollbackで修正、削除する方法
・コマンドラインを使用しての修正、

## マイグレーションの扱い
・テーブルの設計図や仕様のこと
・データーベースにテーブルを作成するために必要なファイル
・カラム名に対して、カラムの型を指定する
 integer型(数値)、string型(短文の文字)、text型(長文の文字)などがある

モデルを作成
“`
rails g model テーブル名(複数形)
“`

モデル作成時に生成されるマイグレーションファイルに必要な情報を記述する

“`
class CreateAddresses < ActiveRecord::Migration[6.0] def change create_table :addresses do |t| # t.カラムの型 :カラム名,     オプション t.string :postal_code, null: false t.string :cit

元記事を表示

条件をクラス化してコードの拡張性と可読性を向上する

ある処理の実行条件がコンテキスト毎に異なる場合のリファクタリング作業で、
ポリシーパターンの「条件をクラス化する」という考え方がとても役立ちました。

実際のリファクタリングを通じて、「拡張性に優れる」「コードが読みやすくなる」といったメリットを感じています。

この記事では、「条件をクラス化」することでこれらのメリットがどのように実現されるのか、コード例を示しながら解説します。

:::note warn
1. コード例はポリシーパターンの一部を採用したもので、厳密にはポリシーパターンではありません
2. 記事の内容は「リファクタリングを通じて私が実感したメリット」に関する解説が中心です。参考書籍には書かれていない内容が多く含まれています。内容に誤りがある可能性にご注意ください
3. コード例は ruby で書かれています
:::

参考書籍↓
良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
6.3.1 ポリシーパターンで条件を集約
https://amzn.asia/d/065vcay7

## 例)キャンペーン機能

「条件をクラス化する」題材と

元記事を表示

ネストしたルーティングの_pathヘルパーについて

## 読んで欲しい人
– `link_to post_edit_path(@post, @hoge)`でなんで2つ引数を入れているかわからん人へ
– 過去の自分

## 動作環境
– ruby 3.3.0
– Rails 7.1.3.3

## pathヘルパーとは
– URLを生成するための便利なヘルパー

こんなルーティングがあったら
“`ruby:routes.rb
resources :posts
“`

下記のようにURLを生成してくれる

– `posts_path`→/posts
– `new_post_path`→/posts/new
– `edit_post_path(:id)`→/posts/:id/edit
– `post_path(:id)`→/posts/:id

今回メインに扱うのは下記

– `edit_post_path(:id)`→/posts/:id/edit
– `post_path(:id)`→/posts/:id

基本的に、ビューやコントローラに`edit_post_path(@posts)`という使い方をする。
引数を指定して、リンク

元記事を表示

【Rails】saveメソッドとcreateメソッドの使い分け

## はじめに
データ保存などで使用する`save`メソッド・`create`メソッドをどういう使い分けをしたら良いかに悩んだので、
勉強がてら使い分けについてまとめました。

## saveメソッドの使用場面
`save`メソッドは以下のように使用します。
“`ruby:
user = User.new(name: ‘taro’, age: 18) #インスタンス生成
user.save #生成したインスタンスの保存
“`
`save`メソッドの戻り値は`true`か`false`です。
実行結果によって分岐をさせたい場合などは、`save`メソッドが使用できます。

## createメソッドの使用場面
`create`メソッドは以下のように使用します。
“`ruby:
user.create(name: ‘taro’, age: 18) #インスタンス生成+保存
“`

`create`メソッドは`new`と`save`を一度に実行してくれます。
しかし、createはインスタンスを戻り値として返すため、登録に成功したかどうかの判定には使用できません。

## まとめ

元記事を表示

あるある、空白のエラー?!

## ★はじめに★
GitHubでプルリクエストのコードレビューをしたとき、初めての頃は高頻度で出ていたエラーがあります。
それは**コードの末尾に改行をいれて**というエラー:scream:

初期のころは何度もこのエラーに遭遇しました😢
その度、該当ファイルのコードの末尾にひたすら`Enter`
疲れますね

– [ ] なぜ末尾に改行を入れるのか
– [ ] 何かいい方法はないのか

これら情報をアウトプットしようと思います。

## ★なぜ末尾に改行を入れるのか★
前提として、多くのプログラミング言語やツールは、ファイルの終わりに改行がないとエラーや警告を出すことがあるそうです。
歴史的にテキストファイルが行単位で処理されることが多く、行の終わりを改行で示すことが一般的だったから。
具体的には、以下のような理由があります

**1:互換性**
多くのツールやエディタがファイルの終わりに改行があることを前提に作られているため、改行がないと正しく動作しないことがある。

**2:バージョン管理システム**
Gitなどのバージョン管理システムも、ファイル末尾に改行がないと変更として認

元記事を表示

簡単に rails API を実装してみた

# Docker

参考

https://zenn.dev/trysmr/articles/b9c99302ebc205

本記事では、web コンテナのポートを 80:3000 で実装している

# rails API 実装

## cors 設定

`Gemfile`

“`ruby_diff
+ gem ‘rack-cors’
“`

`config/initializers/cors.rb`

“`ruby
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ‘http://localhost:3000’

resource ‘*’,
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
“`

## ログイン機能実装

devise を使用する

### ライブラリインストール

`Gem

元記事を表示

論理否定の`!`と`nil?`メソッドを組み合わして使った際のメモ

# やろうとしたこと
– 条件分岐をさせるにあたって boolean で結果を取得したかった
– 「オブジェクトが nil なら false を返してほしい」という目的
– `nil?`は「nil なら true を返す」ので論理否定と組み合わせた

▲しかし、論理否定`!`をと`nil?`を組み合わせて使うと自分が想定している結果が返ってこない

以下にサンプルを示す
“`:ソースコード
p (“aaa”)
p !(“aaa”)
p (nil)
p !(nil)
p (“———-“)
p (“aaa”).nil? #【1】
p !(“aaa”).nil? #【2】
p !((“aaa”).nil?) #【3】
p (“##########”)
p (nil).nil? #【4】
p !(nil).nil? #【5】
p !((nil).nil?) #【6】
“`

“`:実行結果
“aaa”
false
“———-”
false #【1】
true #【2】
true #【3】
“###

元記事を表示

【Ruby】ifとunless

# if文
“`ruby:qiita.rb
a = 100
if a == 100 #条件
puts “aは100です” #条件を満たした時の処理
end
“`
if文は、条件を満たした時に処理を実行。
条件を満たす時とは、条件がtrueの時。
# unless文
“`ruby:qiita.rb
a = 200
unless a == 100 #条件
puts “aは100ではありません” #条件を満たした時の処理
end
“`
unless文は、条件を満たさない時に処理を実行。
条件を満たさない時とは、条件がfalse若しくはnilの時。
unless == if notのイメージ。

なお、下記のようにif文を用いて書き換えも可能。
“`ruby:qiita.rb
a = 200
if a != 100 #条件
puts “aは100ではありません” #条件を満たした時の処理
end
“`
この場合は、条件(a != 100)がtrueなので、条件を満たした時の処理が実行される。

元記事を表示

【Ruby】演算子達の備忘録

# 比較演算子
“`ruby:qiita.rb
a == b # a と b が等しい
a != b # a と b が等しくない
a < b # a が b よりも小さい a > b # a が b よりも大きい
a <= b # a が b 以下である a >= b # a が b 以上である
“`
等しいかどうかの判断は`==`、変数への代入は`=`となるので注意。
条件を満たせばtrue、満たさなければfalseを返す。

# 論理演算子
“`ruby:qiita.rb
!a # a が false であれば
a && b # a かつ b が true であれば
a || b # a または b が true であれば
not a # a が false であれば
a and b # a かつ b が true であれば
a or b

元記事を表示

ローカルでRailsを環境構築

### はじめに
今回はローカル環境で1からRailsを立ち上げるところまで解説したいと思います。ProgateやRailsチュートリアルなどは専用のエディタとクラウドIDEなどでRubyonRailsを学習することが可能ですが、より難易度を上げ挑戦したいのであれば、自分のパソコンに1から環境構築してみると良いと思います。今回はそんな環境構築を1から解説してみたいと思います

:::note warn
今回はWindowでのインストール方法で解説します
Macでは少々手順が違いますのでご注意ください
:::

## 環境構築の手順

インストールするもの
* Ruby
* データベース(今回はSQLite)
* Bundler
* Rails

この4つのインストールです
早速やっていきましょう

## Rubyのインストール

まずはRubyがインストールされているかを確認しましょう。ターミナル画面で以下のコマンドを打ってみましょう

“`
ruby -v
“`

こちらで以下のような表記が出れば既にインストールされているのでこちらはパスして構いません。
“`
ruby

元記事を表示

OTHERカテゴリの最新記事