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

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

Ruby – How to check instance variable defined? -> e.g defined?(@a) ( Rubyでインスタンス変数が定義済みのことをチェックする )

# Code

Defined

“`rb
@a = nil

defined?(@a) # “instance-variable”

!!defined?(@a) # true
“`

Undefined

“`rb
defined?(@b) # nill

!!defined?(@b) # false
“`

# チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

# Twitter

元記事を表示

初めてのRSpecで学んだこと No.2

## バージョン
– ruby 3.2.2
– Rails 6.1.7.6
————————-

## タスク管理アプリでの、タスクが降順に並んでいるかをRSpecでテストする
タスク管理アプリにて、投稿したタスクを降順に並べ、降順に並んでいるかをテストするために、「最新のタスクが一番上に表示される」、ということを確認するためのコードを書いたが、その時に学んだことを備忘録として残しておく。
“`spec/factories/tasks.rb
FactoryBot.define do
factory :task do
name { ‘パパ’ }
content { ‘日曜日歯医者’ }
end
end
“`

“`spec/system/task.rb
RSpec.describe ‘タスク管理機能’, type: :system do
describe ‘新規作成機能’ do
context ‘タスクが作成日時の降順に並んでいる場合’ do
it ‘新しいタスクが一番上に表示される’ do

元記事を表示

【超基本】RubyでのHTML記述方法

## はじめに
この記事は、プログラミング学習を始めたての方、
特にRuby on Railsを独学やスクールで書いているが、
**「ビューファイルの構造や書き方がいまいちわからない」**
という方向けの記事です。

基本的な内容だけを扱うので、初心者の方向けの記事になります。

例えば、
– html.rubyファイルと普通のrubyファイルやhtmlファイルの違い
– “` <% %> “` と “`<%= %>“` の違い

などを述べます。

私自身もまだまだ初心者なので、この記事に間違いがあればご指摘いただけると幸いです。

## 記事を書こうと思った背景
この記事を書こうと思った背景は、
私自身、スクールに通っていたときに教材をコピペして勉强していて、
rubyとhtmlが一体となったビューファイルの仕組みや書き方がよくわかっていなかった経験があるからです。

この記事が、同じ状況の方の理解の助けになれば良いなという思いで記事を書きました。

## HTMLとは
HTMLとは、簡単に言うとWEBページを作成するためのマークアップ言語です。
マークアップ言語であっ

元記事を表示

ActiveSupport::Inflectorでacronymを追加するときにはunderscoreメソッドへの影響にも注意が必要

Railsで、以下のように acronym (略語) を追加することがあります。

“`rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym ‘HTTP’
end
“`

主に、定数名で使ったり、`humanize`で使ったりしたいときに設定すると思います。
今回、オートローダーを変更する際に、定数の検索方法が変わるということで、acronymを追加するかどうか、その影響を調査している際に当たりました。

https://railsguides.jp/classic_to_zeitwerk_howto.html#%E7%95%A5%E8%AA%9E%E3%81%AE%E6%89%B1%E3%81%84

## acronym を登録したとき

API documentに書いてありましたので、引用します。

https://api.rubyonrails.org/classes/ActiveSupport/Inflector/Inflections.html#method-i-acron

元記事を表示

Tips: Railsでポリモーフィック関連付けを使うときはインターフェースに依存した実装をするようにしよう

## この記事は何
Railsにはポリモーフィック関連付けという機能があります。

https://railsguides.jp/association_basics.html#%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91

この機能は使い方によっては便利な一方、依存を複雑化させる原因にもなりうるものです。
この記事では、ポリモーフィック関連を使うときにやりがちな「特定のモデルへの依存」を避けるテクニックをご紹介します。

ポリモーフィック関連の具体的な使い方はドキュメントや、以下の記事などをご参考ください。

https://qiita.com/sazumy/items/726e7097c6ca4a9ca6e3

https://qiita.com/itkrt2y/items/32ad1512fce1bf90c20b

## ポリモーフィック関連を使っている時に起こること
ポリモーフィック関連を使っていると、特定の

元記事を表示

【初心者にも分かりやすく】メタプログラミングって何?

## はじめに
**メタプログラミング**について、みなさん聞いたことありますか?
僕は聞いたことはあるけど、何なのか少し前までは知りませんでした。

👨「フレームワークや言語を作るためのプログラミングのこと…?」

みたいな理解でいました。

今回は自分自身の勉強も兼ねて記事にまとめさせていただきます!

## メタプログラミングとは?
以下wikipediaより引用
>メタプログラミング (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

少し噛み砕いていうと、**コード自身を生成する(関数を新しく定義する、変数を作る)コードを書くこと**です。
「ロジックを生成するロジック」とも言われたりします。

これだけでは「だからどういうこと??」となると思うので**Ruby**で例を出していきます。

**通常の関数定義**から見てみましょう。

元記事を表示

RailsでパスによってDBを切り替えれないか

# 概要
Rails6からマルチデータベースを利用できるようになりました
リードレプリカ構成で負荷をうまく分散させたり、取得するモデル単位でデータベースのコネクションを切り替えることができるようになりました

同一のモデルを取得するけれど、パスによって取得するDBを切り替えることを試したので書き残します

今回試した内容の結論から書くと「**concernで無理やり解決した**」となります

## どうやってDBを切り替えるのか
切り替えたいモデルが継承している抽象クラスに`connects_to database`を記述すれば切り替えができます

下記のような切り替えたいモデルとして`Card`があったとき、それが継承している`ApplicationRecord`に対して
writingのDBとreadingのDBを指定すると、必要に応じて切り替わります
“`ruby:app/models/card.rb
class Card < ApplicationRecord end ``` ```ruby:app/models/application_record.rb class A

元記事を表示

Gem追加したときの「まずはinstallコマンド実行してね」を見ていく

# 概要
Gemのファーストコミットをするタイミングがあり、既存のGemでは「初期設定コマンド実行してね。みたいなのがあるけれどどうやってやるのか」と見ていて、少しまとめたので書いておきます

ほとんどが [Railsガイド](https://railsguides.jp/v7.1/generators.html) に書いてある内容なため、初心者向けの記事となっています :pray:

## generate initializer
> 「初期設定コマンド実行してね。みたいなのがあるけれど…
これはアプリケーションにGemを追加したときに初期設定をアプリケーション側に記載する場合、Gem側からジェネレーターが提供されていることがあります

ここでは認証のgemとして使用する `devise` を例に取って確認してみます

### deviseの例
deviseのREADMEに書いてある通り下記のコマンドでdeviseの初期設定を行うと`config/initializers`配下に`devise.rb`が作成されます

“`sh
$ rails generate devise:i

元記事を表示

ブラウザでやり取りできるようにしてみた。

![Animation_xampp_on2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/9c1feb9c-b853-c831-814d-665762e559a8.gif)
備忘録 ホームページにも忘れずに書いておくこと。
やったことは、インストールと立ち上げ。
apache のconfigに書き足す事。
textを作り、書き込んで保存すること。
アドレスは忘れないようにメモをしておくこと。
Apach2_4 php8apach2_4.dllのためXampp3を導入。ruby,pythonはapache2.2でも動く。
サーバーアドレスは127.0.0.1 ネームはlocalhost メールアドレスは内緒や。
後は、出たとこ勝負。xamppは警告出すから、フォルダーを作っておく。他もアドレスのため独立させた「-」はプログラムでまいなすに間違わない様に「_(アンダースコア)」わからんことはcopilotiに聞く。
VSCoodo,terapad,Screen To Gif,Visual S

元記事を表示

Workatoでコネクタ開発に挑戦!ExcelVBA上がりがRubyに苦労した話

## はじめに

Workatoでは、標準で多くのコネクタが用意されています。コネクタはSaaS製品の認証やトリガー/アクションを含んでいるため、Workatoレシピ開発者はコードを書く必要がほとんどありません。

しかし、SaaS製品によってはコネクタが存在しないことがあります。その場合、Workato内でコネクタを開発する必要があります。
ExcelVBA上がりの私は、コネクタをゼロから開発することに挑戦してみました。

## Workatoのカスタム コネクタ概要
コネクタ開発を始める前に、Workato公式では以下のように紹介されています。
>始める前に…
Workato には他にも多数の機能があり、ユニバーサル HTTP コネクタやカスタムアクションなど、統合のニーズがそれほど複雑でない場合は、お客様が望むものを実現するのに役立つ可能性があります。
>カスタム コネクタが必要であると判断した場合は、開発者ポータル(新しいウィンドウを開く)をクリックして、探しているアプリケーションにカスタム コネクタを提供した人がいるかどうかを確認します。

参照元:[Workatoドキュ

元記事を表示

[Ruby on Rails]既存のテーブルにカラムを追加するためのマイグレーションにえらい苦戦した話

## 経緯
初任教育研修で、既存のタスク管理アプリに機能を追加する際に苦戦したときのメモです。
タスク管理アプリに、タスクの期限機能を追加開発する際に、既存のtasksテーブルにduedateカラムを追加しようとしていました。

## db:migrateコマンドの実行
まずはTasksテーブルにduedateカラムを追加するためのマイグレーションファイルを作成するためにgenarateコマンドを実行します。

“`terminal
rails g migration AddDueDateToTasks duedate:datetime
“`

これで自動的に以下のようなマイグレーションファイルができました
“`Ruby
class AddDueDateToTasks < ActiveRecord::Migration[7.1] def change add_column :tasks, :duedate, :datetime end end ``` ## マイグレーションファイルの編集の際に陥った勘違い まず、自分が勘違いして書いた間違ったコードが

元記事を表示

[Ruby]配列やハッシュの展開

配列はオブジェクトの前に`*`を、ハッシュはオブジェクトの前に`**`を付けることで「展開」することができます。「展開」が何を意味しているかは、[マージ](#マージ)や[引数](#引数)の欄を参照してイメージを掴んでください。

## マージ

`merge`メソッドや`reverse_merge`メソッドを使ってもハッシュをマージできますが、`**`で展開すると簡潔に書けます。

“`ruby
pp ([1, *[2, 3]])
# => [1, 2, 3]

pp ({ hoge: 1, **{ fuga: 2 } })
# => { hoge: 1, fuga: 2 }
“`

ハッシュのキーが重複している場合は、後に指定した値が優先されます。ただし、展開したハッシュの値が展開先のハッシュの値を上書きする場合は、警告が出ます。

“`ruby
pp ({ hoge: 1, **{ hoge: 2 } })
# warning: key :hoge is duplicated and overwritten on line 1
# => { hoge: 2 }

pp ({

元記事を表示

[Ruby]クラスメソッドと定数をprivateにする

インスタンスメソッドをprivateにするには、class定義の中にprivate領域を作って、その中で定義します。

“`ruby
class C
private

def func
“called”
end
end

# private method `func’ called
# pp C.new.func
“`

特異メソッドや定数については、この方法が使えなかったため、記事としてまとめておきます。

## クラス特異メソッド

### `private_class_method`

`private_class_method`メソッドを使ってprivateにします。

“`ruby
class C
def self.get_const
“const”
end

private_class_method :get_const
end

# private method `get_const’ called for C:Class
# pp C.get_const
“`

### 特異クラス

元記事を表示

【Rails】modelでメソッドにselfをつける時とつけないときの違い

どうもこんにちは。

今回はRailsでモデルファイルで定義したメソッドに`self`をつける時とつけない時の違いについて説明します。(おまけでバリデーションメソッドについても説明しています。)

# モデルにメソッドを定義する理由

## 1. 全体で利用可能

モデルに定義したメソッドはアプリケーション全体で利用可能となるメソッドです。そのため、コントローラやビュー、他のモデルの中でも使用することができます。

## 2. 処理の共通化

アプリケーション内で何度も同じ処理をする必要がある場合があります。その時に**同じ処理の共通化**を目的としてモデルにメソッドに定義し、同じ処理をしたい箇所でメソッドを呼び出すことでコードが簡略化できます。

## 3. バリデーションを定義

本来は、`validates`メソッドを使用してカラムに対して「空白禁止」や「文字数制限」を定義します。大体のバリデーションは1行で完結できます。しかし、二つのカラムにデータが入っていない場合のバリデーションを定義するときには、俗にいう「バリデーションメソッド」を定義します。

# selfを付けない場合

元記事を表示

BUILD FAILED (macOS 13.5 on arm64 using ruby-build 20231114)

# 事象
– M2 Macで `rbenv install 3.2.2` が通らない

## 解決策
– .bashrcにhomebrewのpathを明示する
“`bash
export PATH=”/opt/homebrew/bin:$PATH”
“`
– .bashrcでRUBY_CONFIGURE_OPTSを指定する
“`bash
export RUBY_CONFIGURE_OPTS=”–with-openssl-dir=$(brew –prefix openssl@1.1)”
“`

## 原因と流れ
### 原因1(homebrewのpath)
.bashrcの記載を変えた際に、homebrewのpathを消去してしまっていた

“`bash
$ rbenv install 3.2.2
ruby-build: using openssl@3 from homebrew
==> Downloading ruby-3.2.2.tar.gz…
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-l

元記事を表示

戻り値(返り値)とはどういう概念か掘り下げて考えた

## 自己紹介
はじめまして、はると申します。完全異業種からのエンジニア転職を目指して、スクールに通いながら学習をしています。

## 概要
プログラミングにおける「戻り値」について、Rubyの例を用いて説明します。

## 注意
私は前職が完全異業種であり、英語も苦手で、スクールに入って初めてプログラミングに触れました。
そんな自分が理解しづらかった部分を、同じように初めてプログラミングの概念に触れた人に向けてまとめました。
自分の復習も兼ねて、超超噛み砕いて書いているため、周りくどい書き方になっている箇所もあるかと思います。

また、初学者のため、間違っている箇所もあるかもしれませんのでその際は教えて頂けると嬉しいです🙇

## 戻り値とは
戻り値とは、言語に関わらずプログラミングに共通する概念です。
この記事全体を通して説明していきます。

## 噛み砕いて考える
私が初めて戻り値に出会ったときは、「 **あらかじめ定義しているメソッド** を **使って** 結果が得られている」のに、どうして **「戻り」** 値なの?🤔と疑問に思っていました。
 
それでは、例を用いて説明し

元記事を表示

Ruby on Railsアップデート(ErrorReporter#unexpected/with_routingテストヘルパー 他 2023-11-24)

## 引用元
https://world.hey.com/this.week.in.rails/errorreporter-unexpected-with_routing-test-helpers-and-more-1b2c56f6

## 今週のトピック

### [ErrorReporter#unexpectedを本番環境ではreportし開発環境ではraiseするようにする](https://github.com/rails/rails/pull/49951)
https://railsguides.jp/error_reporting.html
この変更により、前提条件違反を報告する`ErrorReported#unexpected`が追加された。

例えば、以下のコードではdevelopment環境とtest環境ではエラーをraiseするが、production環境ではエラーをreportする。
“`
def edit
if published?
Rails.error.unexpected(“[BUG] Attempting to edit a pub

元記事を表示

【Rails】text_fieldにカンマ入り金額が入力され1円で出品されそうになった話

## 経緯
ECサイトにシステムから1800ドルで出品する処理を行ったところ1ドルで出品されるという報告を受ける。
⇨検証のため同じ環境で同じ価格で出品したところ、正常に出品される。
⇨原因がわからない。
という事象が発生。

## 原因
出品テストの担当に聞いたところ1800ドルが1ドル、2200ドルが2ドルになっているとのこと。
ここで「入力値にカンマやピリオドが入っているのでは」と気付く。

入力欄を確認するとnumber_fieldではなくtext_fieldとなっており、
価格を1,800ドルで出品してみると、1ドルで出品される現象が再現された。

## いろいろ確認してみた
今回の対処としてはtext_fieldをnumber_fieldに修正し、
数字以外入力不可能とすることで完了したが、
int型,decimal型で文字列を含む数字を受け取った時の挙動を確認してみた。

1,000 → 1
1,000円 → 1
10,000 → 10
¥10,000 → 0
いちまんえん → 0

先頭から文字列までの数値が保存されるようだ。

## まとめ
価格、数量など数値しか扱わ

元記事を表示

Sinatra アプリで Sass の処理を行う一手法

もっと良いやり方があるかもしれないけど。

# 動機

Sinatra で Sass を使うには,

“`rb
get “/hoge.css” do
sass :hoge
end
“`

みたいな感じ書いてやればいいのだが,この `sass` メソッドを使う方法は [sass](https://rubygems.org/gems/sass) gem もしくは [sassc](https://rubygems.org/gems/sassc) gem を使うことが前提になる(たぶん)。
両 gem は既に開発を終了しており,イマドキの Sass 仕様(`@use` とか)には対応していないので,新規プロジェクトでは使いたくない。

Ruby でイマドキの Sass を使うには,[sass-embedded](https://rubygems.org/gems/sass-embedded) gem を採用するのがよいと考えている。

Sinatra では,CSS など静的なもの(動的生成しなくよいもの)は `public` ディレクトリーに入れておけばよく,上記のような `get`

元記事を表示

Go:レシーバについて解説(Rubyとの違いも合わせて解説)

# はじめに
レシーバは一般的に利用される関数と違い形式がわかりづらいです。
本記事を読んでいただき、レシーバの理解に役立てていただければ幸いです。

# レシーバとは
レシーバは特定の型に対するメソッドを定義する際に使用されます。
メソッドが操作する主体を指し、メソッドがどの型に属するかを定義します。

# レシーバの書き方
“`go
package main

import “fmt”

// 1. 型の定義:
// type ~ structは、Rectangle構造体を定義しています。Rectangleは長方形を表します。
type Rectangle struct {
Width, Height int
}

// 2. レシーバを持つメソッドの定義:
// Rectangle構造体に対するAreaメソッドを定義しています。これは長方形の面積を計算します。
func (r Rectangle) Area() int {
return r.Width * r.Height
}

func main() {
// 3. Rectangle構造体のインスタンスを作成

元記事を表示

OTHERカテゴリの最新記事