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

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

Railsコールバック、ActiveRecord::Enum

### コールバックによる制御
**コールバックとは**
特定の処理に引っ掛けて別の処理を呼ぶことをコールバックと言います

メリット
* 前処理、後処理などを宣言的に書くことができる
* 必ず保存後に行いたい処理がある時に、実行の漏れを防ぐことができる

**コールバックの基本的な使い方**
(例)
本の名前を保存する前に、名前に”Dog”が含まれていた場合
“Dog Cute”と文字列を置き換える

~~~md:
class Book < ApplicationRecord 略 before_validation do self.name = self.name.gsub(/Dog) do |matched| "Dog Cute #{matched}" end end # メソッドを使って書くこともできます before_validation :add_Cute_to_dog(独自メソッド) def add_Cute_to_dog self.name = self.name.gsub(/Dog/) do |matc

元記事を表示

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

## はじめに

今回は通勤時間を有効活用することができる、通勤時にQiitaのトレンド記事が届くLINE Botを開発しながら**Railsと外部APIの連携**、**LINE Messaging API SDKの使い方**、**LINE Flex Messageの使い方**を学んでいきます。

チュートリアル形式で実際にLINE Botの開発をしながら開発方法を解説していきます。

## この記事の対象者

– LINE Bot開発に入門したい人
– Railsと外部APIの連携手法を学びたい人
– 個人開発でLINE Botを作ってみたい人

## 目標成果物

LINE側から「出勤なう」と送られてきたタイミングでQiitaのトレンド記事上位5つを返すLINE Bot。

![IMG_7062.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695521/cd79cc33-f523-2bf8-296f-882f7b242c66.jpeg)

## LINE Botについて

### LINE B

元記事を表示

【Rails】Userがいいねした投稿一覧作成

# はじめに
ユーザーがいいねをした投稿の一覧を見れるようにしたい。
しかし、users_path(indexアクション)は別の用途で使用している。
そこで、routesに新しいルーティングを追加し、専用のページを作成する。
**完成図**
![favorited_posts.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/9d49289d-01ee-3f42-cb9b-6ad0d272478d.gif)

# 前提
使用環境は以下の通りである。
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
| 4 | Kaminari | 1.2.2 |
| 5 |

元記事を表示

【Ruby on Rails】ActionTextとMathJax 3.2で数式を表示できる簡易エディターを実装する

# はじめに
個人開発にて、Action TextとMathJax(バージョン 3.2) で、簡易的ではありますが数式を表示できるエディターを作成しました。
– [Rails ガイドーAction Text](https://railsguides.jp/action_text_overview.html)
– MathJax
– [GitHub](https://github.com/mathjax/MathJax)
– [ドキュメント](https://docs.mathjax.org/en/latest/index.html)

左の画像のように数式を入力してプレビューボタンを押すと、右のように数式が表示されます。

|![スクリーンショット 2022-08-01 16.32.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519173/2eba4e53-b590-0b26-9c20-75047f21d775.png)|![スクリーンショット 2022-08-01 1.17.04.p

元記事を表示

OpenAPI API仕様書の作成からコードの自動生成までやってみた

# はじめに

OpenAPIを触る機会があって
* API仕様書の作成
* API仕様書からコードの自動生成

を行ったのでその際にやったことを備忘録も兼ねてまとめます。

# API仕様書の作成

API仕様書を作成するにあたってOpenAPIを使用します。
ただ実際動かすまでに以下のような側面があります。

* 環境構築が少し面倒
* 環境構築できるまでOpenAPIがどういったものかイメージしづらい

なので、
[Swagger EditorのWeb版](https://editor.swagger.io/)
が実際に触って動かせるのでオススメです。

コードの横にプレビュー表示してくれて、
かつ非同期で更新してくれるのでAPI仕様書はこれ見ながら作成しました。

“` yaml:openapi.yml
swagger: ‘2.0’
info:
description: >-
This is a sample server Petstore server. You can find out more about
Swagger at [http:

元記事を表示

DB設計を改修する~Model編~

# はじめに
Q&Aアプリを作成しています。DB設計で改修が必要になったので記事にしました。
今回はモデルの関連付けを解消します。

## 改修前のDB設計
![Qiita構想前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/c54664f0-4379-4035-d530-95e76f5f6b9a.png)
![msg.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/4527a299-5f52-72de-6827-095fe090a7fe.jpeg)

【解答】
質問(Question)に対して、最初に投稿(アソシエーション)されたCommentのオブジェクト
【コメント】
解答に対して、投稿(アソシエーション)されたCommentのオブジェクト

**ややこしい!**

## 改修後のDB設計(予定)
![Qiita構想後.png](https://qiita-image-store.s

元記事を表示

ソフトウェアの真の自由を実現するサービス、forgefriendsとは何か!!

なんとなく[oauth2のGitHubリポジトリ](https://github.com/oauth-xx/oauth2)を覗いたら、Peter Bolingって人が[なんか楽しそうなことをやってた](https://github.com/oauth-xx/oauth2/discussions/622)んですよ。

# [おれはGitHubをやめるぞ!](https://dev.to/pboling/im-leaving-github-50ba)

GitHubはFOSSではない!プロプライエタリで秘密主義だ!
GitHubをFOSS開発に使うことを深く懸念する!!
I’m leaving Github!!
oauthはGitHubをやめるぞ!!

とまあそんなようなことを言っています。

# [今こそ!GitHubを辞めるときが来た!](https://sfconservancy.org/blog/2022/jun/30/give-up-github-launch/)

上記記事からリンクされている、[Software Freedom Conservancy](https://sf

元記事を表示

バリデーションエラーが日本語で表示されない。

# はじめに
本記事はプログラミング初心者が、「現場で使える RubyonRails5 速習実践ガイド」(通称)「現場Rails」で学習を進めていくにあたって、つまずいた点、バージョンの違いによるエラーが出た点などを解決した方法を備忘録も兼ねてまとめているものです。
そのため、記事の内容には誤りがある可能性があることをご理解ください。
誤りがあればお手数ですが、ご指摘いただければと思います。よろしくお願いします。

# 環境
Ruby 3.1.2
Rails 7.0.3.1

# エラーが表示されない
![スクリーンショット 2022-08-01 17.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737125/f4d06848-5596-44d2-2f70-448f534d8b53.png)

・名称を入力せずに登録しようとした時、赤枠のところに日本語でエラーメッセージが出てくるはずなのですが、出てきませんでした。(レイアウトが整っていないのは、ご了承ください?)
まず、そもそもエラー

元記事を表示

scopeの引数のブロック内にメソッドが定義されている場合の挙動

# はじめに

Railsのソースコードにて

“`ruby
class Shirt < ActiveRecord::Base scope :red, -> { where(color: ‘red’) } do
def dom_id
‘red_shirts’
end
end
end
“`

というコメントアウトを発見。

https://github.com/rails/rails/blob/main/activerecord/lib/active_record/scoping/named.rb#L117-L123

scopeの引数にブロックがあって、その中にメソッドが定義されている。初めて見る書き方だった。

調べてみても意外とどのような挙動をするのか書かれていないので、記事にしてみる。

# 第三引数のブロック内にメソッドを定義するとどうなるか

“`ruby
class Post < ApplicationRecord scope :ids_less_than_five, -> {where(‘id < ?', 5)} d

元記事を表示

最近思うrspecをシンプルにする書き方(オレ流)

# rspec書き方指南ではない

最近自分でやってみて、テストが意外に楽に書けるのではないかと思うやり方をまとめてみた。
ベストだとか唯一の書き方だとかそういう事を言いたいわけではない。各自自分の好きなやり方で書けばいいと思う。最終的には自分の書いたクラスがちゃんとテスト出来ていれば目的は達成している。

個人的な主観としてテストは出来るだけシンプルにしたい。そうじゃないと個人的にテストを書くのが嫌になるし、テストが間違ってて、そもそも何をテストしてるのか?という事になりたくない。
と言うことを解決できるのではないかという投稿。

### 要点

– クラス内のメソッド(処理)は出来るだけシンプルにしたい
– 一度しか呼ばれないようなロジックでもメソッドに落とし込みたい
– メソッドが増える分、内部のメソッドと外部向けのメソッドをちゃんと意識する
– itに説明は要らない
– テスト中に使用する変数内容は実際の条件を意識しない
– `subject`と`allow`をよく使う
– `expect(…).to have_received(…)`をよく使う
– `expect{.

元記事を表示

【Ruby on Rails】rails-latexを利用してPDFを作成

# はじめに
Ruby on Railsで個人開発をした際に、gem [rails-latex](https://github.com/amagical-net/rails-latex)を使って、ユーザーが入力したTeXコードをコンパイルしてPDFを作成する機能を実装しました。
関連する記事があまりなかったので、どのようにしたのかを残そうと思います。

# 設定
PDF作成には `LatexToPdf.generate_pdf(code, config)`メソッド([rubydoc](https://www.rubydoc.info/gems/rails-latex/2.3.0/LatexToPdf.generate_pdf))を利用するので、gemをインストール後、その設定を行います。初期設定は以下の通りです。
(注)「・・・」の部分は、`Users/・・・/(appのルートディレクトリ)`が入ります。

“`
LatexToPdf.config
=>
{:recipe=>[],
:command=>”pdflatex”,
:arguments=>[“-ha

元記事を表示

私の新人研修はこんな感じでした。

プログラミング未経験の新卒2人が、開発期間4週間で
「社員間で本を貸し借りできるアプリ」を作成しました!
image.png
このアプリは、社内の課題を解決するアプリを作成するという新人研修の成果なのですが、この開発の道中には多くの学びがありました。

ここでは、この新人研修がどのように進んだのか、そして各段階で私が何を考えていたのかを書いていこうと思います。

# 目次
[1.研修の概要](##1-研修の概要)
[2.研修前の準備](##2-研修前の準備)
[3.テーマ決め](##3-テーマ決め)
[3.UI・UX設計](##3-UI・UX設計)
[4.計画立て](##4-計画立て)
[5.実装](##5-実装)
[6.リファクタリング](##6-リファクタリング)
[7.おわりに](##5-おわりに)

##

元記事を表示

Rails及びDocker環境でのpry-railsのデバッグ方法

## なぜ記事を書こうと思ったか
Rails及びDocker環境でpry-railsでのデバッグをおこなったので、そのやり方を記載致します。
これまで、行っていたデバッグよりもより細かくコードを確認でき、すごく便利に感じたので、多くの方が使ってくれると嬉しいです。

## Rails及びDocker環境でpry-railsでのデバッグ手順
**※Dockerは構築して、起動してある事を前提として記載致します。**
### デバッグ手順
1.Railsのコードで動作を止めて、確認したいコードの直後に`binding.pry`を追加します。
今回は例として、createメソッドのコードに付け足したいと思います。
“`
def create
permit_parameters = params.permit(:name, :age, :sex).to_h
binding.pry

user = User.create!(
name: permit_parameters[:name].to_i,
age: permit_para

元記事を表示

【Ruby on Rails】検索結果のレコードを並び替える

# はじめに
レコードの検索・並び替え、それぞれを単独に行うのであれば容易にできますが、**検索結果のレコードを並び替える**となると、検索結果をどのように次のリクエストに引き継ぐのかが問題になります。個人開発で検索・並び替え機能を実装した際にこの点に悩んだので、誰かのお役に立てればというのと、自分の実装に問題があればご指摘いただけると嬉しいなということで、自分がどのように解決したかを残したいと思います:bow_tone1:

# 前提
## どのように問題を解決するのか
HTTPはステートレスなプロトコルなため、複数のリクエスト間で状態を保持するためには何らかの方策が必要です。代表的なものにセッションとDBの利用がありますが、
– セッションを利用すると、ユーザーがアプリケーションから離脱した時なども検索条件が残り、次回検索・並び替えのときに条件が引き継がれるなど、個人的に気持ち悪い。
– 検索条件のような一時的なものをDBに保存するのは違和感がある。

じゃあどうするか。

小森裕介(2010)『プロになるためのWeb技術入門』講談社の 「3.4 Webサーバーへの要求をどのように

元記事を表示

Railsを久しぶりに触ったので整理してみた

## 概要
開発時に使用するメモを整理しました。

## Rail APIモードでの始め方
1. `bundle init`
2. `gemfileを修正`
3. `bundle install`
4. `rails new . -d postgresql`
5. `gibo dump Rails macOS >> .gitignore`
6. `rails db:create`

5番のgiboは.gitignoreを簡単に充実してくれるパッケージ。
`vendor/bundle`や`.DS_store`などをよしなに設定してくれる
`brew`経由でinstallした気がする 興味があれば調べてみてください

## Model
DB関係の処理を担う

## 新しいモデル・テーブルを作成
“`rb
# 引数を与えてmigrationの中身を埋める
rails g model User[任意のモデル名] name:string age:integer

# Modelを作成
rails g model user(任意のモデル名)

# 間違えたら下記で削除
rails d mod

元記事を表示

【Ruby on Rails】deviseの導入から実装するまで

## 目標
deviseを導入し実行できるまで

## 開発環境
ruby ‘3.1.2’
rails ‘7.0.3’

## 実装
devise導入から、実装までの一連の流れ

### deviseをインストール
“`Gemfile.
gem ‘devise’
“`
“`ターミナル.
% bundle install
“`

% rails g devise:install
rails g deviseコマンドは、deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理します。

実行すると、モデルが生成され、routes.rbにはdeviseに関連するパスが追加されます。

### Userモデルを作成
“`ターミナル.
% rails g devise user
“`
### マイグレーションファイルを編集
“`
class DeviseCreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |

元記事を表示

コントローラ#アクションとHTTPメソッド・ルーティングヘルパーの対応表

コントローラ#アクションとHTTPメソッド・ルーティングヘルパーの対応表です。
コントローラスペックをリクエストスペックで置き換える際に使ってください。

| コントローラ#アクション | HTTPメソッド ルーティングヘルパー |
| :———————: | :——————————-: |
| articles#index | get articles_path |
| articles#new | get new_article_path |
| articles#create | post articles_path |
| articles#show | get article_path(:id) |
| articles#edit | get edit_article_path(:id)

元記事を表示

【Rails】いいね機能index追加(resourceからresoucesへの変更)

# はじめに
先日、いいね機能を実装した。↓

https://qiita.com/vaza__ta/items/c0bc7f590793ab5a4769

showテンプレートにいいねしたユーザー一覧を表示するようにしていたが、indexテンプレートを実装するよう変更する。

その際にroutes.rbでresource=>resourcesに変更した。
これにより、ルーティングの変更が発生するため、その修正すべき部分を解説していく。

# 前提
下記のテーブルは作成済み。
users(ユーザー)
posts(投稿)
favorites(いいね)
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |

# ルーティングを修正する
indexを追加するために、resouceをresourcesに変

元記事を表示

【ドメイン駆動設計】なぜ値オブジェクトそのものを比較できるようにしなければならないのか?

値オブジェクトは以下の3つの要素を持ったオブジェクトだとされている。

1)不変である(一度インスタンスが作られたら、それが保有する属性の値は変化してはいけない)
2)交換が可能である(再代入=交換によってのみ値を変更することができる)
**3)等価性によって比較される**

このうち、3)は絶対に必要なんだろうか?

例えば、Date型にかなり近い、YearMonth(年と月をもったオブジェクト)を定義してみよう。

“`ruby
class YearMonth
attr_reader :date

def initialize(year, month)
@date = Date.new(year, month, 1)
end

end
“`

一応値オブジェクトとして定義しているものの、「日付が1日のDate型オブジェクト」」としても外部から認識できる。なら、YearMonthそのものを比較できなくても、保有しているDate型(プリミティブ型)同士を比較すればいいんじゃないか?という疑問が生まれる。

実際にやってみよう。

“`ruby

year_mo

元記事を表示

【日付計算】Rubyで◯時間前、◯日前、◯ヶ月前、◯年前と計算するメソッド

業務で更新日(updated_at)と今日の差分を計算して○日前と返すapiを作成することがあったのですが、この仕様とマッチする記事がなかったのでQiitaに残しておきます!

以下の記事を参考にさせていただきました。
基本的なロジックやコードの解説はこちらの記事を参考にしてください。

[満経過月数を計算するロジック(Ruby)](https://qiita.com/tomoya_sakusaku/items/71801ad618394ca3cbc7 “満経過月数を計算するロジック(Ruby)”)

## 今回の仕様

**最終更新日から今日の差分を計算して○日前と返す**

『0~24時間前』 『1~30日前』 『1ヶ月~12ヶ月』 『1年~』の単位で区切る

例) Today:2022/07/30/10:00
Last_updated:2021/07/30/19:00
⇨『一年前』を返す

例)Today:2022/07/30/10:00
Last_updated:2022/06/30/19:00
⇨『一ヶ月前』を返す

例)Today:2022/07/30/19:00
Las

元記事を表示

OTHERカテゴリの最新記事