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

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

Ruby オブジェクト指向

Ruby Ruby on Rails の世界ではオブジェクトで溢れています。
では、オブジェクトとは一体なんなのでしょうか?
辞書で調べるといろいろな意味が出てきますが、
簡単にいうと「もの」のことです。
私たちの身の回りにもいろいろなものが溢れています。
例えば、椅子 水筒 ベッドなどなど、
それぞれの「もの」が仕事をしてくれて私たちの生活を豊かにしてくれています。

Rubyの世界も同じで、たくさんの「オブジェクト」で溢れています。
「オブジェクトを自ら作り、使うことで、コンピューターにしてもらいたい仕事をしてもらう」これがRubyです。

それぞれのオブジェクトは自分のクラスを持っています。
例えば

昨日の記事の例で言うのならば
「佐藤先生 ・・・ 先生クラスに属している」
このようなイメージです。

では実際にコードを書いてクラスを調べていきましょう。
“`
“あああ”.class
=> String /文字列
2.class
=> Integer /整数
“`

“あああ”はString(文字列)クラスに属しています。
2はInteger(整数)クラスに属しています。

元記事を表示

rails ネスト機能について

今回はrailsのルーテイングの時に役に立つnestについてまとめて見ました。
ネストを使うとルーテイングの見やすさが一気に上がるので、ぜひこの記事を参考にして見てください。

早速ですが、ネストを理解する前に、掲示板とコメントの関係を思い出してください。

掲示板とコメントの関係ですが、これは、必ずと言っていいほど、掲示板の中にコメントが書かれていますよね。
このQiitaも全く同じ機能で、掲示板を僕が一つ記事を書き、そこに読者様からのコメントがありますよね。
こういう風に一対多(掲示板が1、コメントが多)の関係になっているものはネストでルーテイングを表現してあげましょう。
そちらの方が視覚的にも見やすいです。

具体的には以下をご覧ください。
Boardモデル
“`
class Board < ApplicationRecord has_many :comments end ``` Commentモデル ``` class Comment < ApplicationRecord belongs_to :board end ``` ネストの表現方法は下のよう

元記事を表示

[railsチュートリアルで理解必須]railsアプリケーションの仕組み

# はじめに
今回はrailsの仕組みやどのように動いているかをアウトプットしていきます!
もし誤りがございましたらコメントでご指摘ください!

# 前提
Usersリソースをscaffoldで生成している。

# Model-View-Controller (MVC)
**railsアプリケーションの仕組みを理解する上でとても重要なのがMVCモデルです**
**この理解を曖昧にして勉強を続けているといつか必ず詰みます(実体験)**
MVCモデルとは、ソフトウェアをModel・View・Controllerの3要素に分割し、プログラムを整理しやすくする考え方です。
railsはこのMVCというアーキテクチャパターンを採用している。
> Railsアプリと通信する際、ブラウザは一般的にWebサーバーにリクエスト (request) を送信し、これはリクエストを処理する役割を担っているRailsのコントローラ (controller) に渡されます。コントローラは、場合によってはすぐにビュー (view) を生成してHTMLをブラウザに送り返します。動的なサイトでは、一般にコントローラは

元記事を表示

Ruby on Railsのrefileでwrong number of arguments (given 3, expected 2; required keyword: object)が発生したときの対処

Rails初心者大学生です。

こちらを元に、編集画面にrefileで画像アップロードをしようとした所、上記のエラーが吐かれたので奮闘しました。
再び同様の事態が起きても対処できるようにメモ。

## 環境
Ruby: 3.1.2
Rails: 7.0.2.4

## 原因
https://teratail.com/questions/313718
上記の回答によると、どうやらrefile自体が長らく保守されていないため、現在のバージョンに対応していないらしいです。

## 試したこと
バージョンダウンを試みました。rbenvを利用してインストールし、Gemfileの内容を変更。
Ruby: 2.7.6
Rails: 6.1.3.2

こちらで、「bundle install」を実行すると、
“`
Bundler could not find compatible versions for gem “activesupport”:
In snapshot (Gemfile.lock):

元記事を表示

Gem のクラス継承・モジュール利用を可視化する Gem を作った

# 概要
正確には、可視化しようと頑張る(正確に可視化できるわけではない) Gem

https://github.com/tommy-012/ancestors_visualization

使い方は、↑ に書いてあるので、気になった人はどうぞ

# きっかけ
別件で、Twitter Gem を見ていて、GitHub ページに[クラス継承の ER 図](https://github.com/sferik/twitter#object-graph)があって、全体感を把握する上でいいいなと

クラス継承だけでなくモジュール利用も可視化できたらなと思い、ancestors 等を使って検討していたらそれっぽいものが出来たので

汎用的に使えるよう Gem にしてみた

# 事例
イメージ湧かない人もいると思うので、既存 Gem([Twitter](https://github.com/sferik/twitter))に対して、実行してみた結果を載せる

![twitter_ancestors_20220505113344.png](https://qiita-image-store.s3.

元記事を表示

「image_tag モデル名.image」で中身の画像データはあるがビューで表示されないことの解決策 / Rails/アクティブストレージを使用

railsの勉強を始めて1ヶ月の初心者です。
今回はタイトルの解決までの道筋を記事にまとめておきたいと思い、投稿いたします。

### 解決したいこと

中身の画像データはあるが
ビューで保存されない状態を解決したい

##### 現在の状況
————————-
・Railsを使用
・アクティブストレージで画像を投稿・保存している(データは保存されている)
・アクティブストレージを使用しているモデルの名前は「item」
・保存した画像を一覧で表示するためにeach文を使用

###### コントローラー indexアクション
(他のデータも表示したいため.allで取得 / 他のデータは正常に表示されている状態)
“`
def index
@items = Item.all.order(‘created_at DESC’)
end

“`

###### indexのビュー
“`
<% @items.each do | item |%>
   <%= image_tag item.image, class: "item-

元記事を表示

Ubuntu 22.04にJupyter NotebookとIRubyをインストール(pyenv, rbenv, Bundler を使用)

– それぞれのバージョンが上がった以外は[前回の Ubuntu 18.04 のとき](https://memo88.hatenablog.com/entry/2020/06/07/112841)からあまり変わっていません
– 手軽に試したい場合は公式の Docker イメージを使うのが良いと思います([IRuby の README](https://github.com/SciRuby/iruby/blob/master/README.md) を参照)

# バージョンなど

“`
Ubuntu 18.04(コンテナ外の作業環境)
anyenv
pyenv
Python 3.10.3
rbenv
Ruby 3.1.2

jupyter 1.0.0
jupyter_core 4.10.0
notebook 6.4.11
iruby 0.7.4
“`

# Docker の用意

元記事を表示

rspecで該当部分のSQLのログをコンソールに出力する

# 背景
実際にどんなSQL出てるのか見たい。
ローカルで単発想定。

belongs_toのvalidationでSQL呼ばれてるとかに気付くことができる。

# 出力方法

“`.rb
# before
# subject { described_class.start!(user_id: user.id) }

# after
subject do
user_id = user.id
using_sql_logger do
described_class.start!(user_id:)
end
end
“`

こう書き換えるとSQLが出力されるようにした。

# 準備

“`spec/support/sql_logger.rb
# frozen_string_literal: true

module SqlLogger
def using_sql_logger
cached_logger = ActiveRecord::Base.logger
ActiveRe

元記事を表示

rails twitterみたいに投稿してからの時間を表示 完全版

rails でTwitterのように投稿時間を「何分前」と表示したい場合

ステップ1  posts controoller のcreateアクションでPost .newにcreated_at:        params[:created_at])を追加する

ステップ2  index.htmlで投稿一覧をつくる。(これは自分の作りたいものによって変わる)

ステップ3  表示したいview(私の場合index.html)で<%= time_ago_in_words(post.created_at) %>前 を書く。

ステップ4  about 1 hour 前 や  1day 前         などが表示されるようになる。

ステップ5  config.time_zone = “Asia/Tokyo”
        config.i18n.default_locale = :ja   をconfig/application.rbで入力する

ステップ6  config/locales/en.yml で 
ja:
datetime:
distance_in

元記事を表示

jQueryインストール

こんにちは
未経験から転職を目指すものです

今回はrailsアプリに
jQueryを入れて
画面に動きをつけていこうと
思います。

## 環境
* macOS Monterey 12.3.1
* Ruby 3.1.2
* Bundler 2.3.10
* Rails 6.1.4.7

# jQueryインストール
まずはjQueryをインストールしていきます。
rails5以前はjquery-railsというGemをインストールするのが
主流のようですが
webpacker管理するには
yarnコマンドを使用しないといけないので、
yarnを使用してjQueryをインストールしていきます。

“`
$yarn add jquery
yarn add v1.22.18
[1/4] 🔍 Resolving packages…
[2/4] 🚚 Fetching packages…
[3/4] 🔗 Linking dependencies…
[4/4] 🔨 Building fresh packages…
success S

元記事を表示

Railsのdeviseでパスワードリセット時にメールアドレス以外の値もチェック項目として使用する

# はじめに
こんにちは。
Rails書き始めて4ヶ月になりました。

今回はdeviseを使用したユーザ認証基盤において、パスワードリセット時にメールアドレス以外の値もチェック項目として追加してみました。

参考になれば幸いです:bow:

# 結論
以下では、emailとusernameの2つの値でチェックしています。

“`ruby:user.rb
class User < ApplicationRecord devise reset_password_keys: %i[email username] end ``` あとは、formでusernameもPOSTされるようにすればOKです:ok_hand: # 解説 パスワードリセット時のkeyは以下で`email`がデフォルトで設定されています。 https://github.com/heartcombo/devise/blob/main/test/rails_app/config/initializers/devise.rb#L135 こちらを上書きすることでkeyを増やすことができます。 上書きはconfig

元記事を表示

非同期時の送信ボタン制御について

# 記事の内容
非同期での送信ボタン制御を実装する中で色々と躓いたため、備忘録も兼ねて記録として投稿しました。

今回は、XMLHttpRequesを使用して JavaScript から非同期的にデータを送信する方法をご紹介いたします。

# 完成形

[![Image from Gyazo](https://i.gyazo.com/0b3d2fa3696586e4a03339fcda9dc771.gif)](https://gyazo.com/0b3d2fa3696586e4a03339fcda9dc771)

# 完成形のコード
modelオプションに設定している`@pdf`は、コントローラで定義しているインスタンス変数になります。
`gem`は`wicked_pdf`を使用しており、ここではPDFファイルを生成する処理を記述しております。

https://qiita.com/inoue9951/items/4498e5d130702d884352

※ コントローラ、フォーム部分は一部割愛しております。

“`ruby:order_page.html.erb
<%= form

元記事を表示

Ruby で Translation API を叩く

# ゴール
以下を ruby から叩く。

https://cloud.google.com/translate

[500,000 文字 / 1 ヶ月までは無料](https://cloud.google.com/translate/pricing)なので、とりあえず Translation API Basic

# 事前準備
具体的には、[こちら](https://cloud.google.com/translate/docs/setup)
– GCPのプロジェクト(課金の有効化)を作って
– 翻訳APIを有効にして
– 認証JSONファイル(サービスアカウント経由で作成)を取得する

[Translation API Basic を叩いてみる](https://cloud.google.com/translate/docs/basic/translating-text)(BasicはV2、AdvancedはV3)

# Gem から API を叩く
– [ドキュメント](https://cloud.google.com/translate/docs/reference/libra

元記事を表示

MySQLの外部キー制約(ON DELETE)を指定しているならRailsのdependentは未指定でOK!

今までMySQLの外部キー制約(ON DELETE)とRailsのアソシエーションに設定する`dependent`は、同じ挙動のものを設定しておけばいいだろうと思って特に意識せずに設定していましたが、本当にそうなのか気になったので動作を検証してみました。

# 前提条件

## MySQLの外部キー制約

今回の検証では、外部キー制約のDELETE時の挙動を検証します。
検証するのは下記の3つです。

* RESTRICT
* CASCADE
* SET NULL

外部キー制約についての詳細はMySQLのドキュメントをご覧ください。

https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html

## dependent

dependentはhas_one/has_many/belongs_toに設定できますが、今回の検証ではhas_manyを使います。

検証するのはMySQLの外部キー制約に対応する下記の3つです。
restrict_with_errorはrestrict_with_excepti

元記事を表示

Rails6でScaffoldがエラーになる

### 環境
Rails 6.1.5
テンプレート:slim-rails 3.4.0

### viewのテンプレートをSlimにしている場合Scaffoldでエラーになる

いざScaffoldしようと思って
“`sh:
$ rails g scaffold hoge a:string b:integer
“`

とすると、modelとcontrollerは作成されるが、
“`sh:
in `model_resource_name’: wrong number of arguments (given 1, expected 0) (ArgumentError)

in `template’
“`
変なエラーが出てviewが作成されない。

# 色々調べてたどり着いたのがこちら
[Rails scaffold views throws wrong number of arguments error](https://stackoverflow.com/questions/71735314/rails-scaffold-views-throws-wrong-number-of-

元記事を表示

【Ruby on Rails】railsでスタディープラスっぽいもの作ろうとしてみた(グラフ表示)

# はじめに
自分のスキルアップのために人気アプリ、スタディープラスのトレースをしていてその過程でちょっと悩んだところがあったので備忘録として記事として残します。もし、もっとスマートな書き方があったらご教示ください。

# 実装
実装に際して前提として①基本となる投稿機能(Tweetモデル) ②deviseを用いたユーザー機能 の2つが実装されているという前提で作成を進めていきます。
また、tweetsテーブルにstrig型でtagという名前のカラムを事前に追加しておくようにお願いします。

## カテゴリの選択と追加
### 1.モデルの作成とアソシエーション
勉強した科目などのカテゴリを追加・保存するためのテーブル(tagsテーブル)の作成を行います。
コマンドプロンプトで以下のコマンドを実行してください
“`
rails g model Tag name:string
“`

“`
rails db:migrate
“`

また、アソシエーションの設定もしておきましょう!

“`ruby:tweet.rb
has_many :tags
“`

“`ruby:

元記事を表示

SOLID原則を具体例で説明

# SOLID原則

## S (Single Responsibility) 単一責任の原則

管理者とユーザーの処理を一緒に書いてはいけないという原則です。なぜなら、

・管理者に関するコードだけをいじっているのに、一般ユーザーの機能に影響が出る可能性があると、確認すべき範囲が広がってしまうから。
・管理者、一般ユーザーのコードがごちゃ混ぜになりコードが読みにくくなるから。

「管理者はここ、一般ユーザーはあっち」とすることで機能追加や運用、デバックがしやすくなります。

## O (Open-Closed) オープン・クローズドの原則

何か機能を追加するとき、既存のコードを変更するのではなく新しく追加するのが好ましいという原則です。なぜなら、既存のコードの変更は既存の機能のバグを作ってしまう可能性があるから。

例えば,createDrinkメソッドがあります。1種類のフルーツから飲み物を作ります。

“`ruby
def createDrink(fruit)
~
end
“`
ここで、2種類のフルーツから飲み物を作りたくなった場合。
悪い例。既存のコード

元記事を表示

Rails(API mode) で、passwordを持ったUserの作成

## 手順
“`sh
rails new pwsample -d postgresql –api
cd pwsampple
rails db:create
“`

`./Gemfile`のbcryptが含まれる行のコメントを外す。
“`
gem “bcrypt”, “~> 3.1.7”
“`

Userモデルとコントローラーを作成。
passwordは、`password_digest`というカラム名にする。
“`sh
rails generate model user name:string email:string password_digest:string
rails generate controller users
rails db:migrate
“`

`./config/routes.rb`に`resources :users`を追加
“`ruby:./config/routes.rb
Rails.application.routes.draw do
resources :users
end
“`

`./app/models/user.rb`に

元記事を表示

destroy action実行時にcouldn’t Item find with ‘id’=1のエラー表示

# はじめに
 実装中のフリマアプリにて、「ログイン状態の場合にのみ、自身が出品した商品情報を削除できること」という実装条件に合わせて記述したのち、商品詳細ページから削除ボタンをクリックすると、下記のエラーが発生しました。
結論、エラー内容とは関係なく、destroyアクション処理後の挙動を記述していないことが原因のようでした。
![スクリーンショット 2022-05-05 18.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/573f5dda-8eaf-f86c-a72c-578109c6f946.png)
 上記エラー文を確認すると、 「ItemsControllerに記載しているdestoroy actionを実行したがid1が見当たらない」といった指摘がされているようでした。

# 仮説・検証

### 仮説1
 エラー文の通り、idが受け渡されていない事が原因でエラーが発生しているのではという仮説のうえ、MVCの流れに沿って下記の検証作業を行いました。

### 検証

元記事を表示

可変長配列に要素を追加する処理の色々

# これは何?

go の slice や C++ の std::vector のようなものに要素を追加する場合に世の人々がどうするのかを調べた。

# そもそも

いわゆる可変長配列というものの代表的な実装は

* 適当にメモリ確保して、そこに要素を格納する
* 確保した容量に入らなくなったら、別の場所にメモリを確保して、そこに全部移動してから新要素を追加する

というものになっている。
この「別の場所にメモリを確保」の際にどうするのかが悩みどころ。
必要サイズぴったりにメモリ確保すると「1個追加」を1000回行った場合に絶望的に遅くなる。
多めに確保したいところだけど、多すぎるのはやっぱり損。

みんなどうしているのかなと思って調べてみた。

# 各実装

## go の slice

https://github.com/golang/go/blob/go1.18.1/src/runtime/slice.go#L193
辺りに実装がある。

1. 旧キャパシティが 256未満なら、新キャパシティは旧キャパシティの倍。
1. 旧キャパシティが 256以上なら、新キャパシティは旧キャ

元記事を表示

OTHERカテゴリの最新記事