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

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

Rails – トランザクションをネストするとロールバックが効かない

# 例

内側でロールバックを実行してもコミットされてしまうようだ

“`rb
p Example.count

ApplicationRecord.transaction do
ApplicationRecord.transaction do
Example.create
end

raise ActiveRecord::Rollback
end

p Example.count # カウントが増えてしまう
“`

単純なコードであれば気づくが、コードが入り組んでいる場合は注意

# 外側の制御で回避

外側のトランザクションで `joinable: false` を指定すると、外側のトランザクションへの合流を防げるようだ

“`rb
p Example.count

ApplicationRecord.transaction(joinable: false) do
ApplicationRecord.transaction do

Example.create

raise ActiveRecord::Rollback
end
end

元記事を表示

Railsコールバックのchanged?って?

## きっかけ
「order_idが変わったらorder_statusの値を変更する」という実装でコールバックを使用した際に、
コールバックの挙動を理解できておらず躓いてしまったのでアウトプットとしてまとめてみました。

## ケース1
コールバック発火しない
“`ruby:order.rb
enum status: {
unchecked: 0,
checked: 1,
error: 3
}

after_update :order_status_reset, if: -> { order_id_changed? }

def order_status_reset
self.unchecked!
end
“`
### 原因
after_updateではorder_id_changed?に該当しない。

after_saveも同様だが、changed?は
現在の値と変更しようとしている値を検証するもの。

そのため、updateやsaveした後は
すでに変更しようとした値は保存されており、
changed?は発火しない

元記事を表示

忘れないようにRailsのDB編集2

### すべてChatGPTより

`add_column` メソッドでカラムに `int` を指定する場合、`integer` データ型を使用します。これは通常、一般的な整数を表現するためのデータ型です。

具体的には、以下のように `add_column` を使って `integer` データ型を指定します。

“`ruby
class AddTaskToArchives < ActiveRecord::Migration[7.0] def change add_column :archives, :task_id, :integer, null: false add_foreign_key :archives, :tasks, column: :task_id end end ``` このコードでは、`:archives` テーブルに `:task_id` という名前の `integer` データ型のカラムを追加しています。そして、`add_foreign_key` メソッドを使用して `:archives` テーブルの `:task_id` カラムを

元記事を表示

[Rails] routes.rbのresource, resourcesの違い

# 目的
現在携わっているRails のプロジェクトのroutes.rbで、名前が似ているresourceメソッド,resourcesメソッドが使用されていたので、その意味、違いについてまとめる。

# resources
7つのアクション(index、show、new、create、edit、update、destroy)のルーティングを一括生成してくれるメソッド
例)
routes.rbに
“`routes.rb
Rails.application.routes.draw do
resources :users
end
“`
と書くと,
“`
$ rails routes
users GET    /users(.:format)    users#index
POST   /users(.:format)  users#create
new_user GET    /users/new(.:format)    users#new
edit_user GET    /users/:id/edit(

元記事を表示

ローカル環境でrails newする際に -d postgresql オプションでエラーが出る際の対処法 & PostgreSQLのインストール【Rails 7, Mac OS】

:::note warn
PostgreSQLがインストールされていないために発生するエラー対処の記事となります。PostgreSQLの使い方の記事ではありませんので、ご了承くださいませ。
:::

## はじめに
Railsのハンズオンや環境構築資料でよく見かける以下の rails new コマンド。
“`zsh
$ rails new test_app -d postgresql

# –database=postgresql と読み替えていただいて問題ありません。
“`

データベースオプションである、`-d postgresql` を指定することで、Railsと同時にPostgreSQLのセットアップをすることができます。※デフォルトはsqlite3が指定される。

しかし、ローカル環境にPostgreSQL自体をインストールしていない場合、pg gem(PostgreSQLのRubyライブラリ)のインストール中にエラーが発生する可能性がありますので、以下備忘録として、手順を残したいと思い記事にしてみました。

※ 現在プログラミングスクールに通っております。カリキュラム

元記事を表示

【Ruby on rails】Aws::S3::Errors::RequestTimeTooSkewed

# はじめに
プログラミングを勉強して3か月ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

今回はオリジナルアプリにS3を導入した際に発生したエラーの対処法を共有したいと思います。
下記の記事を参考にさせていただきました。

https://zenn.dev/karaage0703/articles/47838858dd3107

# 今回のエラー内容
今回のエラーはS3導入後に画像を保存しようとした際に発生しました。
エラーの内容は、リクエストを行うクライアントとリクエストを受信するサーバーとの間の時間のズレに問題があることを示します。
[![Image from Gyazo](https://i.gyazo.com/31f3193a16ea29a8075139fadf75fe4a.png)](https://gyazo.com/31f3193a16ea29a8075139fadf75fe4a)
このエラー原因としては大きく2つ挙げられます。
1つ目は、AWS側の地域設定に誤りがあり、時刻がズレてしまっている。
2つ目は、システムの時間が合っていない。
今回

元記事を表示

Cloudinaryを使用し画像をアップロードした際に出てきた⚠️

[![Image from Gyazo](https://i.gyazo.com/57290ade50e032a6c71fc37d9da80362.png)](https://gyazo.com/57290ade50e032a6c71fc37d9da80362)
[![Image from Gyazo](https://i.gyazo.com/4374e5eebd3e620466b7dfe9e67b0983.png)](https://gyazo.com/4374e5eebd3e620466b7dfe9e67b0983)
この警告は「混合コンテンツ」と呼ばれるもので、HTTPSページがHTTPリソースを読み込んでいることを示しているそうです。ブラウザはこのような状況でセキュリティの観点から警告を発していました。

## 原因
cloudinaryからの画像がHTTPでリクエストされていることが問題でした。

“`ruby:cloudinary.yml

development:
cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %

元記事を表示

【Rails】開発/本番環境で違う初期データ(seeds.rb)を入れる、データの入れ直し方法など

# はじめに

初のオリアプ開発で、開発環境でユーザー等のテスト用の初期データを大量に生成する必要があったのと、本番環境でもデモ用初期データを手動追加するのが面倒なので、何かいい方法はないかと考えてました。
というのも、私の今作っているアプリは複数のユーザーモデルやメインとなるデータモデルを前提としている機能が多いんですよね。
調べたらseed.rbを活用すると初期データを入れられるとのことで、ではやってみよう!となったのです。

## 前提

– Ruby 3.2.0
– Rails 7.0.8
– 本番環境はRender
– Renderにて既にデプロイが出来ていること

# seeds.rbファイルとは?
データベースに初期データを設定するために使用されるファイルです。
このファイルに記述されたコードは、rails db:seedコマンドを実行することで実行され、指定されたデータがデータベースに追加されます。

# ディレクトリ構造
元々は以下のようになっていると思います。
“`
db
├── migrate
├── seeds.rb
└── schema.rb

元記事を表示

railsにBootstrap導入後の表示が左寄り問題

# 左寄せになっているのを治す方法

Bootstrap導入直後の、
app>views>layouts>application.html.erb

“`rails



MyCloset

<%= csrf_meta_tags %>
<%= csp_meta_tag %>

<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>


<%= yield %>


“`

この時 bodyに直接書き込まれているのが左寄せになる原因です。
(左寄せしたい人は直接記入が良いみたいです)

yiel

元記事を表示

【Ruby】クラス定義についてサクッと解説!

## 内容

Rubyにおけるクラス定義はオブジェクト指向プログラミングの核心部分です。この記事では、基本的なクラス定義から継承、クラス式の評価順序に至るまでを掘り下げていきます。

### 基本のクラス型

“`ruby
class Foo
def initialize(a)
@a = a
end

def method1
@a
end
end

foo1 = Foo.new(1)
foo2 = Foo.new(2)
p foo1.method1 # 出力: 1
p foo2.method1 # 出力: 2
“`

`initialize` メソッドではインスタンス変数 `@a` に引数 `a` を代入しており、`method1` ではこのインスタンス変数を返すように定義されています。

#### クラスへの代入

“`ruby
a = Foo
b = a.new(1)
p b.method1 # 出力: 1
“`

クラス自体もオブジェクトであり、変数に代入して操作することができます。

### クラス式の評価順序

“`ruby
p 1

元記事を表示

Rails 7 でTODOアプリ ⑧ (バリデーションメッセージのテンプレート化)

## はじめに

### 前回は

#### Deviseのビューをカスタム・フラッシュメッセージ として

https://qiita.com/tomoaki-kimura/items/7417b23f25db370ca619

– Deviseのビュー
– Bootstrapの適用
– フラッシュメッセージ

について学びました。

### 今回は

#### バリデーションメッセージのテンプレート化 として

– Railsコンソール
– バリデーション
– errors
– バリデーションメッセージ

について学びます。

では、はじめていきましょう。

## 1. コンソールを使ってみる

最初にちょっと脱線します。

### rails c

ロジックの検証に是非とも使いたいのが、Railsコンソールです。

モデルのロジックやDBの接続も可能なので、データーの入力や削除にも使えますし、クエリの結果を調べたりもできます。

最近では使えるメソッドの候補等も表示されてとても親切なツールになりました。

では、早速ターミナルから作業を始めます。

一旦データーを初期状態に戻した

元記事を表示

【Ruby】ブロックについてサクッと解説!

## 内容
Rubyのブロックは、コードの一部をカプセル化し、再利用可能にする強力な機能です。この記事では、ブロックの基本的な使い方から、スコープの生成、クロージャの使用に至るまでを掘り下げていきます。

### ブロックとは何か?

#### 基本的なブロックの使用

“`ruby
def func x
x + yield
end
p func(1){ 2 } # 出力: 3
“`
この例では、`{}` で囲まれた部分がブロックであり、`yield` を使用してその中身を実行しています。

### ブロックによるスコープの生成

“`ruby
def func y
y + yield
end
func(1) do
x = 2
end
# 「p x」を実行するとNameErrorが発生
“`
ブロック内で定義された変数は、そのブロックの外部からはアクセスできないことを示しています。`{}` と `do…end` はどちらもブロックを生成しますが、一般的に一行で書ける場合は `{}` を、複数行にわたる場合は `do…end` を使用します。

### ブロッ

元記事を表示

【初学者】はじめてのDockerを使った環境構築【Docker + Rails7.1.2 + esbuild + Node.js 20.5.1 + Tailwind CSS + daisyUI + PostgreSQL】

# はじめに
お疲れさまです!
おおくまです!

今回、はじめて“Docker“を使って環境構築をやってみました!
技術選定としては、
**Docker + Rails7.1.2 + esbuild + Node.js 20.5.1 + Tailwind CSS + daisyUI + PostgreSQL**
こんな感じです!
また、サーバーを立ち上げる際は、
“./bin/dev“のコマンドを使い、
**JSやCSSがビルドされ、なおかつJSやCSSを変更したときに自動的に再ビルドされる**ようにします!
備忘録として残したいと思います!

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# 環境
:::note
Ruby 3.2.2
Rails 7.1.2
Node.js 20.5.1
Docker Desktopをインストール済み
:::

# 手順
“`:ターミナル
mkdir test_app
cd test_app
touch Dockerfi

元記事を表示

Rails7.1の自動生成 Dockerfile から学ぶ entrypoint.sh の最適化

# Rails7.1でDockerfileの自動生成機能が追加された
しかし、この機能は開発環境様ではなく本番環境用のファイルなので
実際開発を行う際には手動でDockerfileを作成する必要がある

今まで利用してきて居た Dockerfile では entrypoint の記述を以下のようにして居た。

“`Dockerfile
COPY entrypoint_dev.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint_dev.sh
ENTRYPOINT [“entrypoint_dev.sh”]
EXPOSE 8080

CMD [“rails”, “server”, “-p”, “8080”, “-b”, “0.0.0.0”]
“`

entrypoint.sh を専属で用意
ファイルをコピーし、実行権限を付与
そしてスクリプトファイルを ENTRYPOINT に指定して居ました。

## Rails7.1 での ENTRYPOINT の指定
今回自動生成されるようになった Dockerfile では以下のようになって居た。
恐らく

元記事を表示

【Rails】 SassC::SyntaxError について

# 概要
この記事では、**EC2**に**Railsアプリケーション**をデプロイするときに直面した **CSS** 関連のエラーについて追及しています。

# 環境
– Ruby: **3.1.2**
– Rails: **6.1.4**
– CSSFW: **TailwindCSS**

# エラー文
下記がデプロイ時に起きたエラーです。
“`sh:Terminal
SassC::SyntaxError: Error: Function rgb is missing argument $green.
on line 607 of stdin
>> color: rgb(239 68 68 / var(–tw-text-opacity));
“`

# 解決方法
production.rbのファイルの末尾に下記の記述を追加します。

“`diff_ruby:config/environments/production.rb
+ config.assets.css_compressor = nil
“`

# 原因
**SassC::SyntaxErro

元記事を表示

【MySQL,Rails】アプリケーションの動作を改善したい(Explain)

どうもこんにちは。

今回はRailsアプリケーションの動きが悪くなっている問題をSQLの観点から調査してみました。

# 経緯

自社開発しているrailsアプリケーションのとある画面の一覧画面を開いた時にめちゃめちゃ時間がかかるという状況にありました。

理由としては10,000件のデータの読み込みのためのSQL実行に無駄な時間がかかっていたことでした。(ざらに30,40秒かかってました。。。)

# SQL調査手順

実際のデータは載せることができないのでダミーデータで手順をまとめます。

## 1. 一覧画面でページを更新したときに実行されるSQLをすべて取得

アプリケーションが動作している環境のログを取得してそこから実行されたSQLを取得します。

今回のアプリケーションは、AWSのElastic Beanstalkで動作しているため、こちらからログを取得しました。
(ぶっちゃけローカル環境でもOKです。)

## 2. 取得したSQLの一つ一つがどのくらい時間がかかるのかDBコンソールで実行して計測する

自分はDBeaverを使用しているので、そこのコンソール上で実行を

元記事を表示

【Rails】Amazon Bedrockを使用して生成AIと会話してみた

どうもこんにちは。今回は前回のAmazon Bedrockの記事に続いての投稿となります。

https://qiita.com/PDC-Kurashinak/items/84b1a7b7598e8a3d4443

今回は、最近話題の`anthropic`の`Claude2`を使用してみたかったのですが、まだAWS東京リージョンでは使用ができなかったので、`Claude Instant`というモデルを使用しました。(バージニア北部かオレゴンリージョンならもう使用できるようですね。)

今回の記事ではBedrockとは何者なのかという説明は省略して、早速実装手順を説明していきます。

# 実装

## 0. AWSコンソール上で必要な設定を行う

この時に、自分のアカウントのアクセスキーとシークレットアクセスキーを入手しておいてください。

## 1. Gemで必要なライブラリを追加する

Gemfileに以下を記述します。

“`Gemfile
gem ‘aws-sdk-bedrockruntime’
“`

## 2. bundle install

ターミナルで`bundle

元記事を表示

【Ruby on rails】Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (111) エラー対処法

# はじめに
プログラミングを勉強して3か月ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

今回は私がPCを再起動したときに起こるエラーの対処法について共有させていただきます。
下記の記事を参考にさせていただきました。

https://medium.com/wado-jp/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8Bmysql%E3%82%A8%E3%83%A9%E3%83%BC%E9%9B%86-a6dc33e77a9a

# 今回のエラー内容
今回のエラーはPC再起動時に「MySQLにサーバーが接続できません」という内容のエラーです。
[![Image from Gyazo](https://i.gyazo.com/045c5f8c90dd44a02541384f9d790517.png)](https://gyazo.com/045c5f8c90dd44a02541384f9d790517)

# エラー対処法
まずターミナルでtmpディレクトリに移動します。
`cd /tmp`
次にlsコマンドでファイルを一覧表示します。

元記事を表示

【VSCode】Ruby on Rails開発を向上させるための必須エクステンション

# 概要
Visual Studio Code(VSCode)には生産性やコード品質を高めるためのさまざまなエクステンションが用意されています。ここでは、Railsで開発する際に使用すると助かるVSCodeエクステンションを紹介します。

# コード品質とフォーマッティングツール
1. [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint
): JavaScriptコード品質を維持するために不可欠なツールで、コーディング基準に従って問題を強調表示し、修正します。

2. [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode): 複数の言語に対応した汎用コードフォーマッターで、機能的であるだけでなく、一貫性のある美しいコードを保証します。

3. [Haml Lint](https://marketplace.visualstudio.com/items?it

元記事を表示

ActionCableでリアルタイム通信の実装

## 始めに

### Websocketとは
ウェブブラウザとサーバー間で双方向のリアルタイム通信を可能にする技術。通常のHTTPリクエストと異なり、一度コネクション(※)を確立すると、そのコネクションを維持したままデータをやり取りできる

※**コネクション**とは、クライアント(通常はウェブブラウザ)とサーバー間で確立された通信路やセッションを指す。

**通常のHTTPリクエスト**
クライアントがサーバーにリクエストを送り、サーバーがレスポンスを返すという単発のやりとり。

### Action Cableとは
RubyonRailsフレームワークに統合された、WebSocketベースの双方向通信ライブラリ。これにより、Railsアプリケーション内でのリアルタイムな双方向通信が簡単に実現できる。

**イメージ図**
[![Image from Gyazo](https://i.gyazo.com/c03bf190f3475eecef700e2e8aa328b1.png)](https://gyazo.com/c03bf190f3475eecef700e2e8aa328

元記事を表示

OTHERカテゴリの最新記事