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

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

Railway CLIでRails開発中にDatabase ‘railway’ does not exist

# はじめに
Herokuまわりのゴタゴタがあって、個人開発はRailwayを使うようになったのですが、ちょっと困ったことがあり、自分用メモとして残しておきます

# db:migrate:resetができない?
開発の初期って、DBの設計が決まっていなくて、実装していくうちに、あ、あれ足りなかったな。
ということは多いでしょう。

そんなとき、結構気軽にマイグレーションを一からやり直すコマンド

“`
rake db:migrate:reset
“`

をしたらいいか!くらいのノリで個人開発をやっているのですが、ちょっと問題が発生しました。

“`
% railway run rake db:migrate:reset
Database ‘railway’ does not exist
We could not find your database: postgres. Which can be found in the database configuration file located at config/database.yml.

To resolve this i

元記事を表示

長距離ドライブをサポートするアプリを作成しました

## はじめに
こんにちは!
[ジョニー](https://x.com/johnny1_ryo) と申します。
未経験からエンジニア転職を目指して、日々学習をしています。

この度、[kodora-co-driver](https://www.kodora-co-driver.com/) を開発しました。

## サービス名 : kodora-co-driver
Image from Gyazo

▼ サービスURL

https://www.kodora-co-driver.com/

▼ Githubリポジトリ

https://github.com/johnny23ryo/kodora-Co-Driver-

## アプリ名の由来

アプリ名「kodora-co-driver

元記事を表示

Rails ネストした配列のJSONに対してStrong Parameterを適用する

Rails: Applying Strong Parameters to Nested Array JSON

フロントエンドで整形したJSONをRailsのエンドポイントで受け取る際に、Strong Parameterの設定で少しハマったので備忘録として記載

環境は以下
* Ruby 3.1
* Rails 6系

# Strong Parameterの中で配列を扱う(文字列の配列)

参考)https://blog.ryskit.com/entry/2024/01/13/020409

“`json:requestのJSONの構造
{
“user”: {
“stringArray”: [
“aaa”,
“bbb”
]
}
}
“`

この構造に対してStrong Parameterを適用する場合、以下のように記述する。
配列であることを明示するだけで良い。

“`ruby:動作するStrong Parameter
params.require(:user).permit(stringArray: [])
“`

#

元記事を表示

【Rails7】button_toの挙動の変更の対応

## 問題
Rails6.1までは、button_toで生成されるHTMLはinputタグでしたが、Rails7からbutton_toでHTMLのbuttonタグが生成されるようになりました。
これにより、アップデート前に設定していたinputタグのCSSやJavaScriptが効かなくなります。

## 解決方法
CSSなどのinputタグをbuttonタグに変更することで対応できますが、以下の設定をconfig/application.rbに入れることで、button_toがRails6.1までの挙動に戻ります。
“`ruby
class Application < Rails::Application config.action_view.button_to_generates_button_tag = false end ``` ## 参考 https://blog.saeloun.com/2021/08/24/rails-7-button-to-rendering/

元記事を表示

Railsでプロジェクトルートディレクトリのパスから辿れるようにする

# 概要
– スクリプトを実行するときに外部ファイルが必要な場合が多々ある
– どこに置く?となると、`~/tmp/` が良いんじゃなかろうかと
– https://railsdoc.com/rails_base
– スクリプトからどうやって取得する?で教えてもらった話の備忘録

# 結論

`Rails.root.join` を利用しましょう

“`ruby
csv_path = Rails.root.join(‘tmp’, ‘file_name.csv’)
“`

コンソールでいじるとこんなオブジェクトが返ってきます(僕の環境下ではDocker利用しており、プロジェクトルートディレクトリが`/app`にしているので、`/app`が表示されています)

“`ruby
$ rails console
[1] pry(main)> Rails.root
=> #
[2] pry(main)> Rails.root.join
=> #
[3] pry(main)> Rails.root.join(‘tmp’)
=>

元記事を表示

Rails – 間違ったマイグレーションを環境に反映してしまった時のリカバリ方法

# 前提

稼働している環境に対して、間違ったマイグレーションを反映してしまった場合
( PRのマージ先を間違った場合など )

今回は誤ったテーブルを新規作成してしまったケースで考える

# STEP 1 – コードの修正

まずは誤ったコードをRevertするなどして、正しい状態に戻してデプロイする

最低限 `schema.rb` に記録されている「最新のマイグレーション時刻」は元に戻す必要がある

“`diff
– ActiveRecord::Schema[7.2].define(version: 2024_09_06_123701) do
+ ActiveRecord::Schema[7.2].define(version: 2024_09_05_100123) do
“`

# STEP 2 – DBのリカバリ

DBを正しい状態に戻す

この例ではSQLを直接実行して、誤って作られてしまったテーブルを削除する

“`sql
DROP TABLE IF EXISTS example_table
“`

Rails経由で実行する場合は rails console /

元記事を表示

【Rails】accepts_nested_attributes_forを使わないとbefore_saveで孫モデルのオブジェクトをビルドしても保存できない

## はじめに

Railsで関連モデルを保存する際の挙動に詰まったため、備忘録としてまとめます。

※この実装は不採用としたので、あまり細かくは調査していません。

この記事におけるバージョンは **Rails 7.2.0** です。

## 問題

実装方針の1つの選択肢として、諸々の事情から下記のように親モデルの`before_save`で子モデルと孫モデルをビルドする方法を検討していました(コールバックは本当は避けたい、、、)

“`ruby:app/models/parent.rb
class Parent < ApplicationRecord has_many :children, dependent: :destroy validates :title, presence: true before_save :build_child # 管理者ID ADMIN_USER_ID = 1 # 子モデルと孫モデルのオブジェクトをビルド def build_child child = children.build( tit

元記事を表示

Railsでwebpack-dev-serverが起動できないエラー

## はじめに
デイトラWeb開発コースを進めている中でwebpack-dev-serverが実行できず、めちゃくちゃ解決に時間をかけてしまったため、原因と解決策を残しておきます。
時間はたくさん使ってしまいましたが、一方で理解が深まった面もあるので、その点も最後にアウトプットします。

## 問題
Railsのプロジェクトで`bin/webpack-dev-server`を実行すると、`Command “webpack-dev-server” not found.`のエラーが出る

## 原因
node.js,rails/webpacker,webpack,webpack-dev-server,webpack-sliの互換性がない

## 解決策
package.jsonに以下を記載
“`
“engines”: {
“node”: “14.16”
},
“devDependencies”: {
“webpack”: “4.x.x”,
“webpack-cli”: “3.x.x”,
“webpack-dev-middleware”: “3

元記事を表示

[Ruby on Rails]enumerize gemでoptionsを絞り込みたい場合

## enumerize gemについて

Ruby on Railsでenumを使いたい時に便利なGem
https://github.com/brainspec/enumerize

ざっくり使い方

“`ruby
class User
extend Enumerize

enumerize :role, in: [:user, :admin, :staff]
end
“`

## 本題: optionsを絞り込みたい場合

enumerizeのoptionsを使用してkey, valueの構造を取得する場合に任意の項目を除外または指定した項目だけを取得したい場合には以下のように指定します。

### 除外したい場合

“`ruby
User.status.options(except: [:admin])
# => user, staffが取れる
“`

### 指定した項目だけ取得したい場合

“`ruby
User.status.options(only: [:user])
# => userのみが取れる
“`

## まとめ

以上、雑ですが忘れそうなの

元記事を表示

[Rails]stubを使うときは評価順序に気をつけた方がいいという話

# はじめに
皆さん`stub`は好きですか?私は正直嫌いです。しかし、外部と通信を行う機能を作成したりする時には切ってもきれない便利な機能です。今回はそんな機能を使うにあたって沼ったポイントがあったので共有していきます。

# 開発環境
– Ruby 3以上
– Ruby on Rails 6以上
– Minitest

# 最初に結論
`Object.new`を`stub`する際は、`.new`される前に引数が評価されるので注意が必要です。

これだけではわかりづらいと思うので、コードで例を見ながら解説します。

# ケーススタディ
以下のような外部とやり取りを行う、`GetterService`があったとします。外部通信を行うのは`GetterClient`なので、テストを行う際は`GetterClient.new`を`stub`することになります。
“` ruby
class GetterService < ServiceBase def call pp '1' data_list = getter_client.fetch_data_list

元記事を表示

Rspecにてcreated_atの検証で失敗する

# はじめに
RspecにてJSON形式のレスポンスデータを検証している際に、
`created_at`や`updated_at`にてデータが一致しないことで困っていた

# 困ってたこと

データ形式:
“`ruby
{
‘key’ => ‘value’,
‘created_at’ => ‘instance.created_at’,
‘updated_at’ => ‘instance.updated_at’,
}
“`

Timeオブジェクトはミリ秒の値まで含んでしまっているため、
データが一致せずにテストが落ちてしまう

“`plaintext
# 期待していたデータ
“created_at” => “2024-08-26T10:35:23+09:00”

# 実際に来たデータ
“created_at” => “2024-08-26T10:35:23.000+09:00”

“`

# as_jsonで試してみた

https://railsdoc.com/page/as_json

as_jsonではハッシュ形式に変換してくれるらしい

creat

元記事を表示

DataTaransferオブジェクトを使えばのvalue属性に値をセットするのと近しいことができる

## 背景

JavaScriptで``のvalue属性に値を直接設定することはできません。

これは、セキュリティ上の理由で、悪意のあるスクリプトがユーザーのローカルファイルを勝手にアップロードすることを防ぐためです。
ブラウザはファイル選択ダイアログを通してユーザーが手動でファイルを選択することを要求します。

しかし、``のvalue属性に値をセットするようなことと近しいことをしたくなる場合もあると思います。(かなりマイナーなケースかもしれませんが)

そのような場合に`DataTransfer`オブジェクトが使えます。

私が遭遇したケースでは、RailsのViewテンプレートからReactのファイル選択コンポーネントを呼び出しているパターンで、そのようなことをしたくなりました。

RailsのViewでは[nested_form](https://github.com/ryanb/nested_form)というgemの`nested_form_for`メソッドでフォームが作られており、そのフォームの中

元記事を表示

Dockerでのエラー例①「docker compose exec web bin/devが上手くいかない」

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## ターミナルでのエラー文
“`:ターミナル
docker compose exec web bin/dev
WARN[0000] /xxxxx: `version` is obsolete
service “web” is not running
“`
※この時docker compose upでコンテナは起動しています。
webに関することも記述しています。

## 原因?

“`:config/routes.rb
Rails.application.routes.draw do

省略

Your::Application.routes.draw do
mount LetterOpenerWeb::Engine, at: “/letter_opener” if
Rails.env.development?
end
end
“`
gem let

元記事を表示

Rails7から追加された簡単にレコードを任意の順番に並び替えられる「in_order_of」

# はじめに

業務で「何かのレコードを特定のid順や数字で並べたい」みたいな要件に出会った経験ある人もいるのではないでしょうか?

当時エンジニア歴2年目の時に詰まった記憶があります笑

そのような時はどうやって実装しますか??

色々書き方はあると思いますが、***Rails7から追加***された“`in_order_of“`というメソッドが便利だったので紹介します。

https://railsdoc.com/page/in_order_of

# in_order_ofを使わない方法

まずは“`in_order_of“`を使用しない方法を考えようかと思います。

“`in_order_of“`の説明だけ見たい人はここは飛ばしてください。

*前提条件

モデル: User
並び替えカラム: id
並び順: [3,2,1]
PostgreSQL使用

“`ruby
ids = [3,2,1]
“`
*実際のクエリは変数を使っているので“`in ($1,・・・)“`みたいになってますが、本題とは関係ないので簡略化しています。

## 1.whereを使って実装

元記事を表示

dockerでrails new する one liner

# これはなに
`docker` で `rails new` するコマンドラインの備忘メモ
“`
docker run –rm -v $(pwd):/app ruby:3.3 bash -c “gem install rails; cd /app; rails new -B -d mysql
“`

# メモ
`-v $(pwd):/app`
コマンドを実行するカレントディレクトリを `/app` にマウントする
このディレクトリ直下に、 `` が作成される。

`ruby:3.3`
使用するdockerイメージ。
ruby 公式からバージョンを選択

`gem install rails;`
ここで、`rails` をインストールする。
必要に応じて、optionを指定

`rails new -B -d mysql;`
ここで、 `rails new` を実行。
`db` に `mysql` を指定

``
作成したい `project-name`

元記事を表示

古いバージョンのNodeやRubyで作ったアプリをherokuでデプロイする際の設定

## この記事の内容
### 起きたこと
herokuを使って講座で作成したWebアプリをデプロイしようしたところ、なにやらたくさんエラーが起こりました。
おきたエラーの詳細はエラー詳細に記載しています。

### 前提(バージョンなど)
– Ruby:2.7.7
– Rails:6.0.6.1
– Node.js:14.15.0
– Windows11でUbuntu(WSL2)を導入

### 原因
– Rubyのバージョンがherokuの最新バージョンに対応していなかった
– Nodeのバージョンがherokuが標準で使用するバージョンと異なっていた
– buildpackを導入していなかった

## エラー詳細1
### エラーメッセージ
“`
!
! The Ruby version you are trying to install does not exist on this stack.
!
! You are trying to install ruby-2.7.7 on heroku-22.
!
! Ruby ruby-

元記事を表示

RSpecで快適にテストを書こう!初心者から上級者まで使える15のテクニック

## はじめに

RSpecは Ruby on Rails アプリケーションでよく使用されるテストフレームワークです。しかし、初めて触れる方にとっては少し難しく感じるかもしれません。この記事では、RSpecの基本から応用まで、15の章に分けてわかりやすく解説します。各章では、具体的なコード例と詳細な説明を提供し、RSpecの理解を深めていきましょう。

## 1. RSpecの基本構造

RSpecのテストは通常、`describe`ブロックで始まります。これはテスト対象を示すもので、クラスやメソッド名を記述します。その中に`context`ブロックを置き、特定の状況や条件を表現します。実際のテストは`it`ブロックの中に書きます。

“`ruby
describe User do
context ‘有効なユーザーの場合’ do
it ‘バリデーションが通る’ do
user = User.new(name: ‘山田太郎’, email: ‘yamada@example.com’)
expect(user).to be_valid
end

元記事を表示

Ruby on Railsの実務(viewの修正業務)をはじめるときに読んでほしい記事

## はじめに

株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。

弊社では、未経験エンジニア・学生インターン生の方が多くRuby on Railsを勉強しているので、入社後はまずRuby on Railsのプロジェクトにアサインし、初日から自社サービスのセットアップ・業務コードを書かせるようにしています。

※ シンシアにおける働き方の様子はこちら

https://www.wantedly.com/companies/xincere-inc/stories

初日からコードを書いて、PRを出すようにしているのですが、初日はまずは簡単なviewの修正業務をしてもらうことが多いです。

Viewの修正業務は

– 修正するファイルを特定する
– classやstyleを修正する

というステップですが、今回は特に**修正するファイルを特定する**ということに焦点を当てて記事を書いていきます。

この記事は

– Ruby on Railsを学び終わったばかりの人でRuby on Railsの業務(Viewの修正業務)を任された人

元記事を表示

Ruby on Railsでコネクションプールを導入したredis-rbの導入方法

# 始めに

Ruby on Rails では、Redis を利用して一時的に値を保持するケースが多々あると思います。(たとえば、カート情報の管理やカウント処理など)
もし Redis の String 型のバリューのみで要件を満たせるのであれば、[Railsのキャッシュ機構(低レベルキャッシュ)](https://railsguides.jp/caching_with_rails.html#%E4%BD%8E%E3%83%AC%E3%83%99%E3%83%AB%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)を利用するだけで、Redis を簡単に扱うことができます。

Rails の `cache_store` に `:redis_cache_store` が設定されている前提で、以下のように Redis を利用できます。
“`ruby
# 取得
Rails.cache.read(key)

# 保存
Rails.cache.write(key, value)

# 削除
Rails.cache.delete(key)
“`
しかし、も

元記事を表示

Rails マイグレーションで1個のテーブルの特定のカラムの照合順序を変更する

# 例

マイグレーションの正当な構文で実現できる方法が見つからなかったため、SQLを直接実行してしまう

“`rb
class ChangeCollation < ActiveRecord::Migration[7.2] def up execute('ALTER TABLE example_table MODIFY `column_name` VARCHAR(255) COLLATE utf8mb4_bin') end end ``` `ActiveRecord::Base.connection.execute` ではなく `execute` だけで書けるようだ # schema マイグレーションを実行すると schema.rb の情報も変わってくれる ```rb create_table "example_table", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "column_name", collation:

元記事を表示

OTHERカテゴリの最新記事