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

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

Thrusterを楽しみにしている

先日、Rails8のマイルストーンが発表された。

その中でAirlockという謎のワードがでていたのをご存知だろうか

Railsのフロントエンドは7以降import-mapsを使ったstimulusコントローラのオートローダーを導入している

基本的に何もしなければRailsアプリケーションはTurboによって最初からSPA化されてるということもあり、このローダーはデフォルトで初回表示時にimport-maps内に記載されてるStimulusコントローラの全ダウンロードを実施する

https://github.com/hotwired/stimulus-rails#:~:text=controllers%20are%20pinned.-,By%20default%2C%20your%20application,controllers%2Findex.js%20file.,-When%20lazy%20loading

この読み込みを高速化するため、Rails7系以降はhttp/2化がパフォーマンス上の重要な要件となっている

https://x.com/dhh/status/17

元記事を表示

[Ruby on Rails]stimulusを用いたプレビュー画像表示機能実装(初学者向け)

私は現在、未経験からのエンジニア転職に向けてプログラミングスクールで学習をしている、いしかわと申します。

今回Webアプリケーションの個人開発で`stimulus`を用いたプレビュー画像表示機能を実装したのでアウトプットとして記事にしたいと思います。
どなたかの参考になれば幸いです。

:::note warn
プログラミング初学者なので、内容に誤り等ある可能性があります
誤りがありましたら教えてくださると幸いです
:::
**環境**
・Mac M1
・Ruby3.2.2
・Ruby on Rails 7.0.8
※importmapではなくesbuildでバンドルしています

# 期待する実装内容
入力フィールドから画像を選択した時、その画像がいずれかの場所に表示される
その画像は保存されているわけではないプレビュー画像とする

# stimulusコントローラの作成
`javascript/controllers`配下に`image_preview_controller.js`を新たに作成します
“`javascript:image_preview_controller.js

元記事を表示

【Rails】has_manyでオートセーブが設定できるのは便利

どうもこんにちは。

今回は、モデル同士の関連付けを定義する時によく使用される`has_many`での便利なオプション`autosave: true`についてメモします。

以降は、以下の記事の知識(`build`メソッド)を使用しています。

https://qiita.com/PDC-Kurashinak/private/413059bf52c7ab14ed16

## has_manyってなに?

`has_many`とは、モデル同士を関連付けるために`belongs_to`と一緒に使用するものです。

UserモデルにPostモデルが子として紐づいていることを定義したい場合は、以下のように定義します。

“`ruby
# Userモデル
class User < ApplicationRecord has_many :posts end # Postモデル class Post < ApplicationRecord belongs_to :user end ``` has_manyにはオプションがいくつかあり、最も使用されるものは`dependent:

元記事を表示

Railsガイド +α メモず 【バリデーション】

# はじめに
[Active Record バリデーション](https://railsguides.jp/active_record_validations.html)を読んでわからなかったこと、メモです。

気になった見出しがあればご覧ください。
# メモず
## バリデーションの種類
### モデルレベルでのバリデーション
Railsの基本的なバリデーション
### データベース制約
メリット:複数のプログラミング言語を使用するプロジェクトであれば、大元であるデータベースレベルでバリデーションをすることは理にかなう。
デメリット:バリデーションのテストはアプリケーションと分離して行わねばならず、保守も困難になる可能性がある。
### ストアドプロシージャ
SQL文をまとめて保存し、関数のように名前で呼び出す。
データベース制約の一種
### クライアント側でのバリデーション
メリット:扱いやすい
デメリット:ユーザーによってバリデーションを変更されてしまうリスクがある。
### コントローラレベルのバリデーション
メリット:手軽
デメリット:再利用性が低い、一貫性が欠如する、全体

元記事を表示

rails db:resetとrails db:migrate:resetの違い

## 発端:データベースのデータ型を間違えて作成していたことに気づいた
データベースを作成後、データ型が間違えていたことに気づいたため、マイグレーションファイルを修正してから「rails db:migrate:reset」を実行しました。

## rails db:resetとrails db:migrate:resetの違い
### rails db:reset
db/schema.rbファイルを元にDBを作成する。
マイグレーションファイルは利用しない。

### rails db:migrate:reset
DBを削除した後に、マーグレーションファイルを古い順から実行してデータベースを作成する。

## 結論:便利!
どうやってデータ型の修正をしよう?
ロールバックだと手順を一つ戻るらしいから、色々やった後だとどうなるのかよく分からないし・・と思っていたので、マイグレーションファイルを修正して実行し直せばいい「rails db:migrate:reset」は便利だな!と思いました。

## 参考
・[Rails: db:reset よりも db:migrate:reset を使

元記事を表示

【Rails】Rspecで500エラーが出る

# はじめに
この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。その場合はご指摘いただけると幸いです。

# 起こった問題
Solidusを使用してECサイトを作成中、Rspec(リクエストスペック)を実行したところ500エラーが返ってきた

# 結論
テストに使用しない場合でもviewで使用しているデータはテストデータとして作成しておく

# 解決までの道のり
### 前提条件
– Solidusに予め用意されているテストデータを使用
– viewには商品カテゴリーのパンくずリスト、商品画像、商品名、金額を表示

### 発生したエラー
スペックファイルは下記のように記述
“`spec/requests/product_spec.rb
require ‘rails_helper’

RSpec,describe “Products”, type: : request do
describe “GET /products” do
let!(:product) { create(:

元記事を表示

Railsでログインを押すとログアウトに表示を変更する方法

## Railsでログインを押すとログアウトに表示を変更する方法

今回はRuby on Railsでログイン機能を実装します!
ログイン機能を実装しようとすると、ログイン・ログアウト・新規登録のボタンが3つできるかもしれません。今回は3つできるボタンを2つで実装し、ログインボタンを押したらログアウトと表示できるようにしていきたいと思います!(イメージは以下の動画です)
![ログイン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687617/30d26900-51b4-51bb-0646-223227b9db92.gif)

:::note warn
注意
この記事は、すでにログイン・ログアウト・新規登録の実装ができていることを前提に書いています。
:::

### 目次
1.View周り
2.コントローラー設計
3.ルート周り

## View周り
まず、ビューページのどこかに以下のようにログイン・ログアウト・新規登録のボタンを実装しているかもしれません。

“`ruby:tweets/i

元記事を表示

Devise 使用 Rails アプリで、パスワード変更機能をユーザー情報編集から分離➡パスワードリセットと統合してみた話

## 概要(やってみたこと)

1. ユーザー編集画面で、パスワードとそれ以外の属性の編集画面を別々にする
1. パスワード**以外**の編集時は確定時のパスワード再入力を不要とする
1. パスワード変更画面/処理はパスワードリセットのView/Actionと共用にしてパスワード変更処理を一つにする

末筆の通りあまりお行儀は良くない気がするので、コードの量より分かりやすさが重要な状況(大規模プロジェクトetc.)には向かないと思います。
コード量抑制を重視する状況下では使いどころもあるかもしれませんが、こんなやり方もできたという一種の頭の体操的に捉えて頂けますと幸いです🙏

なお前提として、本稿内では Devise の認証対象のモデルは「`User`」としています。
モデル名が異なる場合は適宜読み替えてください。

## ソース・環境

ソース全文・全履歴は下記になります。なるべく対応内容ごとの変化が分かりやすいようにコミット単位も調整しました。

https://github.com/k-yamauchi-1/passwords_edit_with_devise

ローカル環境は

元記事を表示

text_fieldとtext_areaの違い

## text_fieldとtext_areaの違い

text_fieldは一行しか入力できないけど、text_areaは複数行入力できる。

元記事を表示

【Rails】意図していないアクションが実行されてしまう時に確認してほしいこと

## はじめに
Railsでアプリ開発をしていて、意図通りにアクションが実行されないことはよくあると思います。
その原因は様々あると思いますが、今回は未来の自分の為に一つの例を投稿します。
ついでに初学者の方々の助けにもなれば幸いです。

## ルーティングの記述の順番を確認する。
Railsのルーティングは、ルートの定義順によって評価されます。
つまり、最初にマッチしたものが実行されます。
以下の場合`item_export_list_path`をリクエストすると
`item#export_list`ではなく`item#show`が実行されてしまいます。
~~~ruby:config/routes.rb
post ‘items/:id’, to: ‘item#show’, as: ‘items_show’
post ‘items/item_list’, to: ‘item#export_list’, as: ‘item_export_list’
~~~
なので以下のように順番を入れ替えて修正
~~~ruby:config/routes.rb
post ‘items/item_list

元記事を表示

dockerコンテナ内でrails dbconsoleが使えないエラーが出た時の対処法

**概要**
—————————————

DBコンソールを起動しようとDockerコンテナ内で以下コマンドを実行したが,エラーが発生。

“`
# rails db
Couldn’t find database client: psql. Check your $PATH and try again.
“`

rails dbコマンドを実行したときにPostgreSQLのクライアントであるpsqlが見つからないときに表示されるとのこと。
Dockerfileを訂正し,PostgreSQLをインストールする必要がある。

**解決策**
——————————————–
Dockerfile
“`rb
FROM ruby:3.1.4
RUN curl -sL https://deb.nodesource.com/setup_19.x | bash – \
&& wget –quiet -O – /tmp/pubkey.gpg https://dl.yarnpkg.

元記事を表示

【Rails】destroyではなくshowが実行される

# はじめに
この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。
その場合はご指摘いただけると幸いです。

# 起こった問題
スクールのカリキュラムでX(旧Twitter)のような短文投稿サイトを作成した際、destroyアクションを実装して投稿の削除ボタンを作成したが、showアクションが実行されてしまった

# 結論
RubyのコードではなくJavaScriptの問題の可能性があるためコンソールを確認してみる

# 試したこと①
元の記述(これだとdestroyできない)
“`
<%= link_to "削除", user, method: :delete, data: { confirm: "本当に削除しますか?" } %>
“`
この記述で作成した削除リンクをクリックするとshowアクションに飛んでしまいました。
特にエラーが表示されるわけでもありません。
調べたところ、link_toをbutton_toに変更すると解決する場合があるとのことだったので試してみました。
“`
<

元記事を表示

【Rails】buildメソッド結構有能かもしれない

どうもこんにちは。

今回はRailsで使いこなすと楽そうな`build`メソッドについて調べました。

# buildメソッドとは?

`build`メソッドは`new`メソッドにかなり似たメソッドです。
ただし、場合によって、`new`メソッドを使用するより`build`メソッドを使用することでコードの簡略化ができます。

# newメソッドとの違い

## newメソッド

– Active Recordモデルの新しいインスタンスを作成する
– モデルクラス自体に対して直接呼び出される

“`ruby
new_post = Post.new
“`

– 関連付けを意識せずに単独でオブジェクトを作成する場合に使用される

## buildメソッド

– `has_many`、`has_one`、`belongs_to`などの関連付けが定義されている場合に使用される
– 関連付けられたオブジェクトの新しいインスタンスを作成し、そのインスタンスを親オブジェクトに自動的に紐付ける
– 関連付けを表すメソッドチェーンの一部として使用される

“`ruby
user = User.fi

元記事を表示

Rails の `render`の注意【Turbo】

# はじめに
「何をすればいいのか」はわかるけど、「なぜなのか」まではわかりませんでした・・・悔しい。

# 問題
ログイン処理のコードです。
“`rb
class UserSessionsController < ApplicationController   def new; end   def create     @user = login(params[:email], params[:password])     if @user       redirect_back_or_to(root_path, notice: I18n.t('flash.user_sessions.new'))     else       flash.now[:alert] = I18n.t('flash.user_sessions.new_failed')       render :new, status: :unprocessable_entity     end   end   def destroy     logout     redirect_to(root_path, no

元記事を表示

ActiveStroage + S3 でファイルを扱う

### はじめに

S3使用時のActiveStorageについて、シンプルな構成で動作の流れと実装方法をまとめました。今回はRailsとDBはHerokuにデプロイしています。

### 全体概要

ファイルアップロード時の流れは下記になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895236/a6931067-be9d-b47f-c9f8-cf3b4e24791a.png)

1. クライアントからRailsにファイルを送信(POST)します
1. ActiveStorageがS3にファイルをPutします
1. ActiveStorageがDBにメタ情報を保存します

### 動作確認環境

– Apple M1
– macOS 14.1.2
– Ruby 3.2.1
– Rails 7.0.6
– gem aws-sdk-s3 1.142.0

## 環境構築

構築時の手順は下記のような流れになります。

1. AWS
1. ファイルを保存するS3のバ

元記事を表示

RDS Blue/Greenデプロイした後のmigrationファイルはどうするべきか?

RDSのBlue/Green Deploymentsは本当に便利な機能ですね。昔はレプリカのサーバーを0から構築していたことを考えると隔世の感があります。

さて、この機能を使ってDBのスキーマを変更した時に問題となるのが、アプリケーションフレームワークにmigration管理の仕組みがあった場合に、DBのスキーマとmigrationの結果に乖離が生じるというものです。要するにmigrationを使わずに直接DBのスキーマを変更したのと同様の状態になってしまうということですね。

これの対応をすることがあったので参考になればと思います。フレームワークはRuby on Railsです。

## migrationを改ざんして辻褄を合わせる

### 空のmigrationを作成する

“`shell
$ bundle exec rails g migration ChangeTableItTakesVeryLongTime
invoke active_record
create db/migrate/20240204115013_change_table

元記事を表示

【Rails】カラムのデータ型、booleanとは?

今日勉強していて初めて扱うカラムのデータ型があったので紹介します!

## booleanとは??
 **true/falseのいずれかを扱う**ことを想定して設定するカラムです。
例えばDM機能においてメッセージを既読か未読に分けたいとき、
既読=true、未読=falseと扱うとデータの管理がしやすくなります。

しかし、マイグレーションファイルに何も制約(あとで説明します)をつけないと、
nilというカラムの値も存在してしまいます。

### 制約とは?

#### NOT NULL制約

モデルを作った時点では、値として`true`、`false`、`nil`の3つが存在してしまい、
nil=??という状態ができてしまうため、booleanを扱うカラムは、
基本的に`null: false`という記述をセットでしましょう。
この記述を**NOT NULL制約**と言います。

#### DEFAULT制約
 また、booleanではもう一つ重要な設定が必要です。それはdefaultがtrueかfalseかという記述です。
この記述がないと、初期の状

元記事を表示

Railsにおけるリクエストからレスポンスまでの流れについて(GET編・POST編)

## はじめに
Railsの処理の流れの基本が理解できてなかったので、
シーケンス図を作ってフローを解説してみました。

## GET編
とあるSNSアプリがあります。ユーザーの一覧ページがブラウザに表示されるまでの流れを説明してください。なお、以下の言葉を使うことを条件とします。

/users (← URLです)
GET
コントローラ
routes.rb
モデル
ビュー
データベース

1\. クライアントは、ブラウザで/usersというURLにアクセスする
2\. HTTPメソッドのGETでサーバへリクエストを送る
3\. それを受け取ったサーバはroutes.rbファイルに定義されているルーティングに基づき、それに対応するコントローラとアクションを特定し、呼び出す

“`ruby:config/routes.rb
get ‘/users’, to: ‘users#index’
“`
この場合、/usersへのGETリクエストはUsersControllerへ、そしてその中で定義されているindexアクションを呼び出す

4\. アクションは必要なデータを処理し、Userモデ

元記事を表示

【Ruby・Rails】nil? ・empty? ・blank? ・present?の使い方

## はじめに
使い分けがフワッとしていたので改めてまとめます。
## メソッドごとの違い

| メソッド |判定対象| 出力 |
| — | ———– | ——- |
| nil?| nil |Boolean|
| empty?|””(空文字)|Boolean|
| blank?| nil + “”(空文字) + [] + {} |Boolean|
| present?|nil + “”(空文字)以外か|Boolean|

https://railsdoc.com/page/empty

## nil?

“`ruby
hoge = nil
puts hoge.nil?
# true
hoge = “”
puts hoge.nil?
# false
“`

## empty?
“`ruby
hoge = “”
puts hoge.empty?
# true

hoge = “hoge”
puts hoge.empty?
# false

hoge = nil
puts hoge.empty?
#undefined method `empty?’

元記事を表示

gem `Sorcery` +αメモず 【Rails】

# はじめに

メモ群なので、気になった見出しをご覧ください!
# メモず
## sorceryの言語(?)思想
[Sorcery](https://github.com/Sorcery/sorcery)の思想のうち、特にお気に入りのポイント
– Less is more:少ないほど良い
– Simple & short configuration as possible:可能な限りシンプルで短い
– Keep MVC cleanly separated – DB is for models, sessions are for controllers. Models stay unaware of sessions:MVCを混ぜない。分離させたまま
### Configuration over Confusion
ぱっと見、Railsの言語思想「CoC」に見えるが、
Railsは「Convention over Configuration(設定より慣例)」
Sorceryは「Configuration over Confusion(混乱より設定)」
と、Railsをもじった別物。
糖衣

元記事を表示

OTHERカテゴリの最新記事