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

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

[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 ``` ## マイグレーションファイルの編集の際に陥った勘違い まず、自分が勘違いして書いた間違ったコードが

元記事を表示

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

どうもこんにちは。

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

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

## 1. 全体で利用可能

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

## 2. 処理の共通化

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

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

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

# selfを付けない場合

元記事を表示

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

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

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

元記事を表示

【Rails】Capistrano × GitHub Actionsで自動デプロイ環境を整える

# はじめに
RailsアプリをCapistranoでEC2(Docker使ってない)にデプロイしています。
普段ローカルで`bundle exec cap staging deploy`を実行してEC2にデプロイしていたのですが、GitHub Actionsでデプロイできるようにしました。
本記事では以下のシチュエーションを想定しています。
* developブランチで修正する
* ローカルでCapistranoデプロイが既にできている
* ステージングサーバーにデプロイする
* Macを使用している

# 前提
CapstranoはSSH接続ができることを前提としています。
ローカルでデプロイできるということは、すでにローカル環境がリモートサーバーにSSH接続ができるように設定されているからです。
しかしGitHub Actionsのランナーは当然設定してあげないと、対象のリモートサーバーとはSSH接続ができません。
ランナーがSSH接続できるようになれば、あとはcapコマンドでいい感じに自動でデプロイしてくれるようになります。

つまり、**ランナーがリモートサーバーとSSH接続

元記事を表示

【Rails】APIのコントローラでparamsを受け取る方法

## 実装

“`ruby: /app/controllers/application_controller.rb
class ApplicationController < ActionController::API before_action :set_params def set_params params = {} request.query_parameters.each do |key, value| params[key] = value.to_s end @params = params end end ``` ## 解説 ### [10.1requestオブジェクト](https://guides.rubyonrails.org/action_controller_overview.html#the-request-object) 以下、日本語訳&要約 > ・リクエスト オブジェクトには、クライアントから受信したリクエストに関する多くの有用な情報が含まれています。
・このオブジェクトでアクセスできるプロパテ

元記事を表示

初めてのRspecで学んだこと

課題で出てきて、初めて取り組んだRspec!
色々なポイントを学んだので備忘録として残しておく。
初学者なので、間違ってる点などあればご指摘下さい。

“`
ruby 3.2.2
rails 6.1.7.6
“`
作成しているアプリはタスク管理アプリ

## SystemSpecの基本
### Factoryを使用したテスト
Factoryとは、railsでテストをする時用のテストデータを作成してくれるテンプレートのこと。
factory_bot_railsというgemをインストールすることで使用できるようになる。
(Factoryを使用する手順(インストール方法など)は今回は省略。)
今回のタスク管理アプリで、「一覧画面に遷移した場合」→「作成済みのタスク一覧が表示される」というテストコードを書く際、Factoryを使用した。

“`spec/factories/task_spec.rb
FactoryBot.define do
factory :task do
name { ‘パパ’ }
content { ‘日曜日歯医者’ }
end
end
“`

元記事を表示

【OpenAI】RailsでChat GPTを導入しよう

## はじめに
どうもこんにちはもきお([@mokio_50](https://twitter.com/mokio_50))です。突然ですが皆さんはChat GPTは好きですか? 自分は大好きです。

どれほど開発の手助けになってきたことか。そんなChat GPTを会社のシステムとAPI連携することになりました。その機能開発を担当したので今回はRailsでChatGPTのAPI連携する流れを記事にしたいと思います。

## 目次
1. APIキーの発行
2. 今回の実装イメージ
3. 実装
4. 検証

## 1. APIキーの発行
外部APIとの連携を行うためにはAPIキーが必要になります。以下の記事が参考になりました。

【画像付き】OpenAI(ChatGPT)のAPIキー取得手順

## 2. 実装イメージ
通常の外部API連携だと例えば法人番号を取得できるAPIと連携するとしましょう。その場合法人番号が取得できるリクエストを作成し、返ってきたレスポンスに対して整形し表示なりデータベースに保存するなりする流れになるかなと思います。

今回はChat機能

元記事を表示

ebay出品時のコンディション設定について

## コンディションについて
コンディションとはヤフオクで言う「新品」「中古」「可」など商品の状態を指すものであり、
eBayへ出品を行う際、一部のカテゴリを除き指定が必須となっています。

じゃあ指定すればいいだけの話じゃん。となりそうですが実はeBayのコンディションは
ヤフオクのようにどの商品でも共通しているわけではなくカテゴリによって
選択できるコンディションが異なっています。

例えば下表の赤枠は食品ですが、こちらは「New」しか選択できないのに対し
青枠のカメラ等は非常に多くのコンディションが選択できます。
![スクリーンショット 2023-11-26 0.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/5d56ae5e-2d5a-a19b-1b28-d4ca73845e65.png)
_[eBayドキュメント](https://developer.ebay.com/devzone/finding/callref/enums/conditionidlist.ht

元記事を表示

勉強記録ウェブアプリ作成の軌跡 3:ルーティングinサーバーサイド

# 概要
「【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう」を使って学んでいく上で自分で勉強記録アプリを作りたいと思ったので、完成するかは置いといて、とりあえず学んだことを自分が作りたいものに置き換えて考えていく。

# 内容
サーバーサイドにおけるルーティングを書いていく。いわゆるwebページのURLを決めていく感じである。
例えば、買い物をするサイト(sample.com)があったとする。そのTOPページのURLが`https://sample.com`だとする。そこから商品一覧ページに遷移した時のURLは`https://sample.com/goods`のようなURLとなるでしょう。また、そのサイトにおける自分のプロフィールページは`https://sample.com/myprofile/12334`などが考えられる。最後の数字はユーザごとに割り当てられたIDと考えてもらえれば。。。

このように特定のURLいわゆるリソースを取得するための道筋、ルートを書き記していく。

# 実装
基本的な書き方は以下の通りである。

– do endのブ

元記事を表示

勉強記録ウェブアプリ作成の軌跡 1:データ・モデルの設計

# 概要
「【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう」を使って学んでいく上で自分で勉強記録アプリを作りたいと思ったので、完成するかは置いといて、とりあえず学んだことを自分が作りたいものに置き換えて考えていく。

# 内容
今回作成する勉強記録アプリで使用するデータを定義する。
今回実装する内容や範囲を確認し、全体像を掴む。そこからデータの種類や名称、どのような情報を持つのか考え、押さえていく。
今回おさえたデータを入れていくデータベースの設計図がMigrationファイルと呼ばれるもの。そして、データの説明書のようなものがModelである。

例えば、記事のデータにはタイトルや内容などの情報が必要である。データベースで言えばカラムとして保持されるtitleやcontentである。このようにどんなデータベースを作って欲しいかという指示するのがRailsのMigrationである。

一方で、記事のデータそのものはどういうデータかを定義しているのはModelである。

Migrationはあくまでデータベースの箱の設計図であり、中身のデータがどうい

元記事を表示

Controllerファイルの機能について

## この記事で何がわかるか?
①Controllerファイルで、なぜリクエスト処理やモデルオブジェクトの操作が出来るか?
②継承元のControllerは、どんな役割があるか?

## モデル名の付いたコントローラーから分かること

“`HomeController.rb
class HomeController < ApplicationController def top end def about end end ``` ```PostsController.rb class PostsController < ApplicationController def index @posts = Post.all.order(created_at: :desc) end def show @post = Post.find_by(id: params[:id]) end def new @post = Post.new end def create @post = Post.n

元記事を表示

bcryptGemを用いたパスワードのハッシュ管理

# bcryptGemを用いたパスワードのハッシュ管理

Webアプリケーションのセキュリティを確保する上で、パスワードの安全な管理は重要な役割を果たします。`bcrypt` Gemを使用することで、Railsアプリケーションにおいて、パスワードを安全にハッシュ化し、管理することが可能です。この記事では、`bcrypt` Gemを使用したパスワードのハッシュ化と認証プロセスについて詳しく解説します。

## bcryptGemとは

`bcrypt` Gemは、パスワードのセキュリティを向上させるために使用されるRubyのライブラリです。このGemは、パスワードをハッシュ化することで、データベースに平文のパスワードを保存するリスクを回避します。

### パスワードのハッシュ化

– ユーザーがパスワードを設定すると、`bcrypt` Gemはそのパスワードをハッシュ化します。これにより、実際のパスワードとは異なる、独特な文字列が生成されます。

## has_secure_passwordの利用

Ruby on Railsでは`has_secure_password`メソッドを使用

元記事を表示

DeviseGemを使わないログイン機能の実装方法

# DeviseGemを使わないログイン機能の実装方法

Webアプリケーションにおいて、ユーザー認証機能はセキュリティとユーザーエクスペリエンスを確保するために不可欠です。しかし、すべてのプロジェクトでDeviseGemなどの認証フレームワークを使用するわけではありません。ここでは、DeviseGemを使わない基本的なログイン機能の実装方法を解説します。

## サインインとログインの基本的な仕組み

### セッションの利用

– ユーザーがログインすると、そのユーザーのIDがセッション変数に保存されます(`session[:user_id] = @user.id`)。
– ブラウザはこのセッション情報を受け取り、以降のリクエストにセッションIDを含めてサーバーに送信します。
– サーバー側はセッションIDを確認し、それに基づいてユーザーがログイン済みであるかどうかを判断します。
– ユーザーログアウトして際は、ユーザーのIDをセッションから剥奪します(`session[:user_id] = nil`)。

### カレントユーザーの設定

– セッションに保存されているユーザー

元記事を表示

Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

## 概要
ruby on railsのDocker開発環境構築中に上記エラーが発生しました。
いくつかの問題が複合していて、解決までにちょっと時間がかかってしまったので、備忘録がてらに記録を残しておいて、後続の誰か参考にしてくれたらな〜という目的でゆるく解決方法を記載しておきます。

## 解決手順(要約)
① socketファイルがどこにあるか確認してdatabase.ymlに設定する
② database.ymlのhost名を変更する

## 解決までの道のり

以下のようにdocker-compose.ymlを定義して、rails new ~で各種ファイルを生成し、あとはrake db:createすればサーバー起動できる…というところまで来ていました。(railsのバージョンは7.1.2)

“`yml:docker-compose.yml
version: ‘3’

services:
db:
image: mysql:5.7
environment:
MYSQL_USER: ${MYSQL_USER_NAME}
MYSQL_

元記事を表示

【ActiveRecord】find・find_by・whereの違いと主要メソッド

# 【ActiveRecord】find・find_by・whereの違いと主要メソッド

Ruby on Railsの強力な機能の一つであるActiveRecordは、データベースの操作を簡単かつ効率的にするORM(Object-Relational Mapping)システムです。この記事では、ActiveRecordの基本的な使い方、特に`find`、`find_by`、`where`メソッドの違いに注目し、New、Create、Update、Delete、Saveといった主要メソッドの概要を解説します。

## ActiveRecordの概要

ActiveRecordは、Ruby on RailsのMVCモデルの中でモデル層を担当し、データベースとの間でデータをやり取りする役割を果たします。SQLを直接書く代わりに、Rubyのメソッドを使用してデータベースを操作することができます。これにより、コードの可読性が向上し、データベース操作が容易になります。

## find・find_by・whereの違い

### findメソッド

`find`メソッドは主にIDに基づいてレコー

元記事を表示

勉強記録ウェブアプリ作成の軌跡 2:フロントエンド設計

# 概要
「【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう」を使って学んでいく上で自分で勉強記録アプリを作りたいと思ったので、完成するかは置いといて、とりあえず学んだことを自分が作りたいものに置き換えて考えていく。

# 内容
前回の記事で決めたデータを元に画面とコンポーネントの設計を行う。
画面に対応するコンポーネントはデータを扱うため、最初の設計を誤ると保守性の低いフロントエンドのコードになるため注意が必要。
コンポーネントというのは、ボタンや画像などのUIのパーツや部品のこと。

# コンポーネント
### 「データを扱うコンポーネント」 Container Component
こちらは親コンポーネントとして複数の子コンポーネントにデータを渡す役割がある。
### 「受け取ったデータをただ表示するためのコンポーネント」 Presentational Component
これはボタンやモーダルなどが含まれる。

コンポーネントがこの2種類に分けられている最も大きい理由として、子コンポーネントの再利用性を高めることが挙げられる。
例えば、複数のペー

元記事を表示

【minitest】 request.refererを使用する方法

# はじめに
最近`request.referer`という便利なものがあることを知り、使用する機会がありました。
ですが、minitestを書いている際にリファラを用いたアクションのテストがうまくいかず少し苦戦してしまったため、備忘録を兼ねてここに残しておこうと思います。

# そもそもrequest.refererってなに?
リクエストヘッダーが持っている情報の一つであり、遷移前のURLを取得することができます。

そのため、`request.referer`を活用することで、
– どのページからの流入なのかアクセス解析ができる
– 遷移元のURLに戻りたい時にリダイレクト先として使用できる

といったメリットがあります。

今回は後者のように、`request.referer`をリダイレクト先として使用した時の、minitestの書き方について考えます。

# minitestでのrequest.referer
ここでは`request.referer`を使用して、遷移元のURLに再度リダイレクトするようなアクションのテストを作成することを考えます。

“`rb
# get

元記事を表示

【Rails】ポリモーフィックが便利〜

どうもこんにちは。

今回はポリモーフィックについてまとめます。

# ポリモーフィックってなんぞや?

ポリモーフィックとは、複数のモデル同士の関連付けの考え方です。

この考え方は、異なるモデルを単一の関連で扱う機能です。

例えば、以下のようにテーブルが存在しているとします。

commentsテーブル
| カラム名 | 型 | 値1 | 値2 | 値3 |
| — | — | — | — | — |
| id | integer | 1 | 2 | 3 |
| comment | text | ワンちゃんかわいい!! | よろしくお願いします。 | この時期寒くね? |
| article_id | integer | null | 1 | null |
| photo_id | integer | 2 | null | null |
| tweet_id | integer | null | null | 1 |

articlesテーブル
| カラム名 | 型 | 値1 | 値2 |
| — | — | — | — |
| id | in

元記事を表示

【Rails】rails db: から始まるコマンドまとめ

どうもこんにちは。

今回はRails開発で使う`rails db:`から始まるコマンドをまとめてみました。

# データベース作成

以下のコマンドでアプリケーションで使用するためのデータベースを作成します。

“`
$ rails db:create
“`

# データベース削除

以下のコマンドでアプリケーションで使用していたデータベースを削除します。(データやテーブル、カラムなどが全て消えます。)

“`
$ rails db:drop
“`

# データベースを最新にする

以下のコマンドでデータベーススキーマの状態を最新の状態にします。

“`
$ rails db:migrate
“`

マイグレーションファイルは以下のコマンドで生成します。

“`
rails g migration AddAgeToUserModel
“`

生成されるマイグレーションファイルは以下のようになります。

“`ruby
class AddAgeToUserModel < ActiveRecord::Migration[6.0] def change

元記事を表示

OTHERカテゴリの最新記事