Ruby関連のことを調べてみた2021年10月31日

Ruby関連のことを調べてみた2021年10月31日

【コードリーディング】Rails 1.0 ActiveRecordのソースコードを読んでみた

#はじめに
Railsポートフォリオ作成でActiveRecordを使っており、作成当時は正直内部処理がどうなっているのか分かっていませんでし、気にもしていませんでした笑

そういった中、実務案件で直接SQLを書く機会があり、ActiveRecordって実際どういう風にSQLに置換して実行しているのか気になりはじめました。

そこで、ActiveRecordのソースコードでSQLに置き換えている仕組みの部分のコードを読んで理解した部分を書き留めたいと思います。

#今回読んだソースコード
今回はコードの流れをシンプルに見たかったので最新のソースコードではなくRails v1.0.0のソースコードを読みました。とは言ってもコードは約1800行もあり、読むのになかなか骨が折れました笑

その中でもController部分でよく使用するfindメソッドに絞って読んだものを記載します。
ソースコード元は[こちら](https://github.com/rails/rails/blob/v1.0.0/activerecord/lib/active_record/base.rb#L378)

#そ

元記事を表示

【Ruby】条件分岐 備忘録

#目的
条件分岐 備忘録

#結論
とりあえず3種類あった。
if文
unless文
case文

“`ruby:timesメソッド #if文
a = 10
b = 20
if a > b
puts “aはbより大きくない”
elsif a < b puts "aはbよりも小さい" end =>aはbより大きくない
“`

“`ruby:timesメソッド #unless文
a = 10
b = 20
unless a > b
  puts “aはbより大きくない”
end
=>aはbより大きくない
“`

“`ruby:timesメソッド #case文
array = [ “a”, 1, nil ]
array.each do |item|
case item
when String
puts “item is a String”
when Numeric
puts “item is a Numeric”
else
puts “item is something”
end
end
=>item is a String

元記事を表示

【RSpec】Railsチュートリアル第6版 第7章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– 第7章(本記事)

#Minitest

###ユーザー登録に対するテスト

“`rb:test/integration/users_signup_test.rb
require ‘test_helper’

class UsersSignupTest < ActionDispatch::IntegrationTest test "invalid signup info

元記事を表示

【RSpec】Railsチュートリアル第6版 第6章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– 第6章(本記事)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

#Minitest

###Userテスト

“`rb:test/models/user_test.rb
require ‘test_helper’

class UserTest < ActiveSupport::TestCase def setup @user = User.new(name: "Example User", email:

元記事を表示

【RSpec】Railsチュートリアル第6版 第5章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– 第5章(本記事)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

#事前準備
Gemfileにfeature spec用のcapybaraを追加

“`rb:Gemfile
group :test do
gem ‘capybara’
end
“`

#Minitest

####StaticPagesコントローラーのテスト

“`rb:test/controllers/static_pages_controlle

元記事を表示

【RSpec】Railsチュートリアル第6版 第4章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– 第4章(本記事)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

#Minitest

####StaticPagesコントローラーのテスト

“`rb:test/controllers/static_pages_controller_test.rb
require ‘test_helper’

class StaticPagesControllerTest < ActionDispatch::IntegrationTe

元記事を表示

Could not find ‘bundler’|rubyのバージョン違いで出たエラー

# 前提
ローカル環境として作成したrailsのディレクトリを
Dockerにマウントしbuildする際に遭遇したエラーの記録です。

# エラー内容
docker build コマンドを実行した時に以下のエラーが出ました。

“`error.sh

ERROR [5/7] RUN bundle install && rm -rf -/.gem 0.3s
[5/7] RUN bundle install && rm -rf -/.gem:
#9 0.283 /usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe’: Could not find ‘bundler’ (2.1.2) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on

元記事を表示

【Ruby on Rails】アソシエーション先のデータを `create_テーブル名` メソッドで作成する。

### 環境
– Ruby 2.6.3
– Ruby on Rails 6.0.1

#できること
`has_one` でアソシエーションしている場合、
アソシエーション先のデータを`create_テーブル名`メソッドで作成できる。

#前提
Authorモデルに対してBookモデルがhas_oneアソシエーションしています。
一人一冊、本を書いている状況です。

“`ruby
# author.rb
class Author < ActiveRecord::Base attr_accessor :name :age has_one :book end # book.rb class Book < ActiveRecord::Base attr_accessor :title belongs_to :author end ``` # 実例 ```ruby author = Author.create(name: 'John', age: 30) author.create_book(title: 'cooking book') ``` # 最後に 上記書いておい

元記事を表示

変数について!

#①.同じ値を何度も使用する!

前回まで値を使うたびに、同じ値であっても毎回記述していました!

しかし、毎回同じ値を書くのはめんどうです!

たとえば円の面積の計算を行うプログラムを作成する場合、毎回円周率の値を書くのは非常に大変な作業です!

“`php
# 半径3の円の面積
3 * 3 * 3.14159

# 半径10の円の面積
10 * 10 * 3.14159

# 半径11の円の面積
11 * 11 * 3.14159
“`

もし円周率を3.14159ではなく3.14へ変更することになったら、記述をすべて書き換える必要があります!

この問題を解決するのが変数という仕組みです!

#②.変数

変数とは、値を入れる箱のようなものです!

この箱には名前をつけることができ、どんな値が入っているのかを簡単に識別できるようになります!

この名前を変数名と言います!

変数を利用することで、値を再利用したい場合に、変数の名前を使うだけで呼び出すことができます!

変数の使い方について、順に説明します!

#③.変数の宣言と定義

変数を作ることを変数の宣言と言います!

元記事を表示

deviseについて

## はじめに
RubyのライブラリであるGemの「devise」のまとめです。
「device」ではなくて「devise」なので注意。

### deviseでできること
「devise」は簡単に認証機能を作成することができます。
認証機能は新規登録画面とかログイン画面とかのことで、
ユーザー登録が必要なサイトでは必須ですよね。

### 導入してみる

#### deviseのインストール
“`ruby:Gemfile
gem ‘devise’
“`
を追加して

“`
$ bundle install
“`
をターミナルに入力。

####初期設定
設定ファイルをインストールするために

“`
$ rails g devise:install
“`

これでdeviseを使用する準備は完了。

config/initializers/devise.rb
config/locales/devise.en.yml

の設定ファイルが作成されているはずです。

####テーブルの作成
今回はモデル名は「User」で作成します。
「devise」はユーザテーブルを自動的に作成

元記事を表示

【Ruby on Rails】migration index too long なエラーを解決

### 環境
– Ruby 2.6.3
– Ruby on Rails 6.0.1
– **PostgreSQL 10**

# 発生状況
今回のエラーが起きたマイグレーションファイル

“` ruby
class CreateFooBarExampleRegistrations < ActiveRecord::Migration[6.0] def change create_table :foo_bar_example_registrations do |t| t.references :parent_example_table_name, null: false, foreign_key: true t.timestamps end end end ``` **長いテーブル名&カラム名に外部キー制約を設定しようとしていました。** # エラー文 実行すると... ```ruby Index name 'index_foo_bar_example_registrations_on_parent_example_table_na

元記事を表示

【Ruby on Rails】Googleスプレッドシートの値を取得してデータベースに取り込む

![スクリーンショット 2021-10-30 20.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/275a826e-b919-77b9-1211-8d897b966081.png)

## やりたい事

API経由でGoogleスプレッドシートの値を取得し、DB(データベース)に取り込みたい。

## 仕様

– Docker
– Ruby 3
– Rails 6(APIモード)
– MySQL 5.7
– Google API(認証周りはサービスアカウントを使用)

## 実装

ぼちぼち実装を始めていきましょう。

### 環境構築

まず、Railsの環境構築から。

#### 作業ディレクトリ & 各種ファイルを作成

“`
$ mkdir google-spreadsheets-importer && cd google-spreadsheets-importer
$ touch Dockerfile docker-compose.yml e

元記事を表示

Railsでcssの値を切り替える

自分のポートフォリオを触っているときに、ちょっと表示の有無を設定したいと思いました。
今回表示の切り替えをしていのは、ログインや新規登録を促す画面です。
私が作っているのは写真投稿サイトです。タグを用いて検索した場合はこの表示を消したいと思います。
ログインなしでも投稿の閲覧はできるため、あってもいいかなと思いました。

#実装

cssの切り替えですが、基本的にはjavascriptを用います。
最低限のjavascriptで簡単にできないかなと考えました。

javascriptで何か動きをするにはイベントを設定しないといけません。
例) click, dbclick, onload,,,,,

[イベント一覧はこちら](https://web-designer.cman.jp/javascript_ref/event_list/)

javascriptでcssの値を変えるには

“`
$(‘cssセレクタ’).css(‘プロパティ : 値’)

#change-colorクラスの値を赤にしたい時

$(‘.change-color’).css(‘color : red’)

元記事を表示

五目並べ問題をrubyで解いてみる

## 五目並べ問題をrubyで解いてみる

最近PAIZAの勉強をしており、その練習問題に出てきた問題。
正直解答を見てもよくわからなかったので、一行ずつ読み解いてみます。
自分用のメモなので、他の方にはわかりにくいかもしれません。

### 問題はこちら
[PAIZA](https://paiza.jp/works/mondai/prob60/tic_tac_toe_9 “PAIZA 五目並べ”)
### 問題文
>5行5列の五目並べの盤面が与えられます。
>盤面の各マスには、”O”か”X”か”.”が書かれています。
>”O”と”X”は、それぞれプレイヤーの記号を表します。
>同じ記号が縦か横か斜めに連続で5つ並んでいれば、その記号のプレイヤーが勝者となります。
>勝者の記号を1行で表示してください。
>勝者がいない場合は、引き分けとして、”D”を表示してください。

それではいきます〜〜

“`ruby:qiita.rb

# `$’で始まる変数はグローバル変数で、プログラムのどこからでも参照できます
$board = []

# 盤面の初期化
# 5回入力する(二次元配列を作

元記事を表示

M1 Macでrbenvのrubyインストールに失敗する

お久しぶりです。

M1 Macにしてからたくさんエラー出てゲンナリしてるのですぐ見返せるようにメモしておきます。

### エラー

ruby 3.0.2 を入れたとき

“`sh
$ rbenv install 3.0.2
Downloading openssl-1.1.1l.tar.gz…
-> https://dqw8nmjcqpjn7.cloudfront.net/0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1
Installing openssl-1.1.1l…
Installed openssl-1.1.1l to /Users/***/.anyenv/envs/rbenv/versions/3.0.2

Downloading ruby-3.0.2.tar.gz…
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.2.tar.gz
Installing ruby-3.0.2…
ruby-build: using re

元記事を表示

【Ruby】paizaで学んだこと

アウトプット。

# to_i
**to_i**は文字列を 10 進数表現された整数であると解釈して、整数に変換します。
整数とみなせない文字があればそこまでを変換対象とし、変換対象が空文字列であれば 0 を返します。
https://docs.ruby-lang.org/ja/latest/method/String/i/to_i.html

# chomp
**chomp**を文字列の末尾から改行コードを取り除いた文字列を返します。
https://docs.ruby-lang.org/ja/latest/method/String/i/chomp.html

# abs
**abs**は絶対値を取得するメソッドです。

Rubyで数値から絶対値を求める方法【初心者向け】

# even?
**even?**は値が偶数かどうかの判定をするメソッドです。
https://docs.ruby-lang.org/ja/latest/method/Integer/i/even=3f.html

# map
配列の要素の数だけ繰り返し処理を行うメソッドです。
https

元記事を表示

【RSpec】Railsチュートリアル第6版 第3章

#はじめに
Railsチュートリアル第6版ではテストフレームワークとして**Minitest**が採用されているが、実際に現場で使われることの多い**RSpec**を用いて、第3章から第14章において作成するsample_appのテストを書いていく。
テストする内容自体は基本的にはチュートリアルの内容に沿って進めていく。
また、RSpecの書き方については、[『Everyday Rails – RSpecによるRailsテスト入門』](https://leanpub.com/everydayrailsrspec-jp)という書籍を参考にしている。

###目次
– 第3章(本記事)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](ht

元記事を表示

プログラムにおける数字の操作!

#①.数値

前回の続きです!

今回は文字ではなく数を扱うための値について学習します!

数値は、数を表現する値です。文字列とは異なり、計算などを行うことができます!

数値は文字列とは違って、ダブルクォーテーション”やシングルクォーテーション’も必要ありません!

以下は数値を使った数の表し方の例です!

“`php
# 整数
10

# 負の値
-10

# 小数
3.14
“`

数をダブルクオーテーションで囲むと数値ではなく文字列として扱われてしまいます!

プログラミングでは文字列の”10″と数値の10は別物です!

数値は計算ができますが、文字列は計算ができません!

irbでRubyの数値を記述し、実行してみましょう!

“`php
# 数値を書いてエンターキーで実行
irb(main):001:0> 12345

# 続けてこのように表示されれば成功
=> 12345
“`

#②.数値で計算

数値は文字列とは異なることを学びました。数値は計算できることが特徴です!

ここからは、メソッドと同じくプログラムでよく使われる演算子について学びましょう!

*代数

元記事を表示

【Rails】validateはカスタムメソッド

よく使用する“`validates“`とめちゃくちゃ似てるカスタムメソッド
モデルの状態を確認し、無効な場合にerrorsコレクションにメッセージを追加するメソッドを作成できる

“`model.rb
class Invoice < ApplicationRecord validate :expiration_date_cannot_be_in_the_past private def expiration_date_cannot_be_in_the_past if expiration_date.present? && expiration_date < Date.today errors.add(:expiration_date, ": 過去の日付は使えません") end end ... end ``` ###RSpecでテストする際 expiration_date_cannot_be_in_the_pastメソッドがprivateだった場合、 モデルの単体テストではなく、リクエストテストで期待するエラーが返るかのテストを

元記事を表示

【Rails初心者】Chart.jsの使い方

グラフ(折れ線グラフ、棒グラフ、レーダチャートなど)を書くのに優れているrubyライブラリを学習しましたので、記録のために残します。

#公式ドキュメント
[Chart.js公式サイト](http://www.chartjs.org)

#使い方

##① rails newしてアプリ作成

“`
% rails new chart
“`

まず学習用のファイルを作成します。

## ② controllerとroutesの設定

コントローラーを作成します。

“`
% rails g controller home
“`

続いてコントローラーにindexメソッドを作成します。

“`ruby:app/controllers/home_controller.rb
class HomeController < ApplicationController def index # 追記 end end ``` コントローラーの記述が終わったらルーティングを作成します。 ```ruby:app/confing/routes.rb Rails.application.ro

元記事を表示

OTHERカテゴリの最新記事