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

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

Ruby on Railsで作成したアプリをHerokuにデプロイするまでにでたエラー

## 初めに
Railsを使ってWebアプリの開発を進めていましたが、Herokuにデプロイする際につまづいた箇所が何箇所かあったので、備忘録としてこちらにまとめておきます。

デプロイの流れはこちらのページを参考に進めました。

https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#heroku%E3%81%B8%E3%81%AE%E7%99%BB%E9%8C%B2

## つまづき① デプロイ時に必要なパッケージがない問題
### 内容
エラー文はこちらでした。
“`
Precompiling assets failed / Error: Cannot find package ‘@babel/plugin-proposal-private-property-in-object’
“`
`@babel/plugin-proposal-private-property-in-object`というパッケージがないようです。

package.jsonには記載がなければ新たにインストールするだけなのですが、しっかりと

元記事を表示

Figmaを使った開発ページのカンプ作成

オリジナルアプリ用に「**Figma**」というデザインツールを使って
デザインカンプを作成します。

## 基本のやり方
まずはFigmaに登録して、プロジェクトを開きましょう。

### アートボードを用意
アートボードは、デザインやページ画面を作成するためのフレームで、
土台となるものです。

この上に、要素を作っていきます。

やり方は、キーボードの「**A**」を押してドラッグで範囲を決めて配置します。
今回はPC用なので、横幅を「**1280px**」とします。

[![Image from Gyazo](https://i.gyazo.com/8e0d7e26f05ecbf4d17ad19b77029881.gif)](https://gyazo.com/8e0d7e26f05ecbf4d17ad19b77029881)

レスポンシブを想定した幅のため、必要に応じて変更してください。

横幅は、右のメニューから変更することもできます。

### インナー
インナーはコンテンツが表示される領域の幅のことです。

インナーの有無の違いは、横幅MAXまでコンテンツを見せるか、

元記事を表示

Railsでメモリ使用量を削減できるメソッド

先日、rake taskを実行した際に、扱うレコード数が多すぎて、サーバーに負荷をかけてしまいました。その解決策として、役立つメソッドを知ったので、まとめています。
## メモリ使用量の削減
### – find_each
##### 使用例
“`ruby:find_each.rb
Model.find_each do |model|
model.update!(hoge: hoge)
end
“`
1000件ずつレコードを取り出し、1レコードずつブロック内の処理を実行していきます。
Modelの内容を一度にすべて取り出すのではなく、1000件ずつ取り出すので、メモリ使用量を抑えることができます。

##### batch_sizeオプションを指定する場合(3000件ずつ)
“`ruby:find_each.rb
Model.find_each(batch_size: 3000) do |model|
model.update!(fuga: fuga)
end
“`

取り出す件数を1000件ずつではなく、任意の件数にしたい場合は、batch_sizeオプション

元記事を表示

英数字のランダム文字列をRubyで生成する

# はじめに
最近、Qiitaに投稿することに少しハマってます。
以前ははてなブログに書いていたのですが、Qiitaの方が綺麗に書けるので
それもあります。

つべこべ言わずに始めましょう

# 結論
使うのは次のコードになります。

大文字小文字含む文字数7の英数字を10個生成します。

“`
10.times do |i|
p [ *’a’..’z’, *’A’..’Z’, *0..9].sample(7).join
end
“`
# 説明
– `*`について
アスタリスクは展開をしてくれます。
今回の場合だと’a’..’z’や’A’..’Z’、0..9を展開します。
流石に
abcdefghijklmnopqrstuvwxyzABCDEFGHYJKLMNOPQRSTUVWXYZ0123456789
を配列に書くわけには行かないですからね。

– sample(n)
配列に作用させるとnこの文字列を重複なしで抽出し、新しい配列を生成します。

– join
作用させた配列の各要素を指定した文字列で連結した文字列を返します
今回は特に指定していないのでそのまま区切り文字を

元記事を表示

Railsで部分テンプレートを細かく分けずに横着して失敗した話

## はじめに
部分テンプレートは、主に内容が重複する部分をまとめるために使われるものです。

内容をまとめることで、後で修正したくなったときも一部だけで良い上に、記述が少なくなってビュー自体が見やすくなります。

今回は、そんな部分テンプレートを使用した際の、私の失敗談について記録します。

## 部分テンプレートの使い方

### 部分テンプレートを呼び出す記述
“`html:
<%= render 'ファイルの場所', テンプレートに記載する変数:上書きする変数 %>
“`
ビューから呼び出す際の基本の書き方はこんな感じです。
部分テンプレートのファイルの場所を指定して、その部分テンプレートに渡す変数を設定します。

例えばこんな感じです。
“`html:
<%= render 'books/book', new_book: @new_book, user: @user %>
“`
この場合はbooksフォルダの「_book.html.erb」ファイルを表示したいので、新しいデータを入れるための@​new_bookとユーザー情報を表示するための@​

元記事を表示

セキュアなパスワードを追加

追加する方法は簡単で、modelにhas_secure_passwordを追加するだけ。
追加することによって次のような機能を使えるようになる。

・ セキュアにハッシュ化したパスワードを、データベース内のpassword_digest属性に保存できるようになる。
・ 2つの仮想的な属性(passwordとpassword_confirmation)が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される。
・ authenticateメソッドが使えるようになる(引数の文字列がパスワードと一致するとUserオブジェクトを返し、一致しない場合はfalseを返すメソッド)。

# 具体的な方法
まずはモデル内にpassword_digestを含ませる必要がある。
以下のコマンドを実施。
“`
$ rails generate migration add_password_digest_to_users password_digest:string
“`
からのdb:migrateを実行。
“`bash
$ rails db:migrate
“`

has_

元記事を表示

Railsチュートリアル第4章学習まとめ

本記事は初心者がエンジニアになる為の学習まとめです。

# 4.1
下記コードではRubyの戸惑う概念が4つある

・Railsの組み込み関数
・カッコを使わないメソッド呼び出し
・シンボル
・ハッシュ

これらをまずは理解するために復習していきたい。

“`app/views/layouts/application.html.erb



<%= yield(:title) %> | Ruby on Rails Tutorial Sample App


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

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

元記事を表示

rails アプリで簡単なvalidationを追加する

※model名をuserと定義した前提で進めます。

# 存在性の検証

./models/user.rbに以下を記述
“`
class User < ApplicationRecord validates :name, presence: true validates :email, presence: true end ``` # 次に文字数制限 先程のコードに追加。 ``` class User < ApplicationRecord validates :name, presence: true, length: { maximum: 50 } validates :email, presence: true, length: { maximum: 255 } end ``` # メールアドレスのフォーマットの制限 ``` class User < ApplicationRecord validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\

元記事を表示

MySQL 8.3環境でmysql2 gemをインストールする方法

## はじめに
MySQL 8.3の環境でmysql2 gemをインストールするのにちょっと苦労したので、対処法を書いておきます。

### 実行環境

本記事は以下の環境で検証しました。

– MySQL 8.3.0 (Homebrewでインストール)
– macOS 14.4.1
– MacBook Air M3
– Ruby 3.3.0

### 注意事項
この記事を書いている時点ではmysql2の最新バージョンは0.5.6です。
よって、mysql2 0.5.6を使う前提で記事を書きますが、さらに新しいバージョンがリリースされたときは対処法が異なる可能性があります。

https://github.com/brianmario/mysql2/releases

### 念のため用語の整理
本記事ではMySQLとmysql2というよく似た用語が出てきます。
プログラミング初心者の方はこれらをしっかり区別しながら読み進めてください。

– **MySQL** = RDBMS(DBサーバー)。執筆時点の最新バージョンは8.3.0(2024/1/16リリース)
– **mysql2**

元記事を表示

Railsの論理削除機能におけるバリデーションスキップとデータ取得時に論理削除分も含める方法

Railsでソフトデリート機能を実装する際に遭遇する可能性のある2つの課題とその解決方法について説明します。一つ目は、特定の操作でバリデーションをスキップする方法、もう一つは、`default_scope`を使用しているモデルでソフトデリートされたレコードを取得する方法です。

## 1. 特定の操作でバリデーションをスキップする

Railsでは、モデルのバリデーションが非常に強力で役立つ一方で、特定の条件下でバリデーションをスキップしたい場合があります。例えば、ソフトデリートの操作では、いくつかのバリデーションを適用したくないかもしれません。

“`ruby
class Reservation < ApplicationRecord # バリデーション validates :is_approved, inclusion: { in: [true, false] } validate :unique_future_reservation_per_customer_and_company, unless: -> { @skip_validation }

# ソフト

元記事を表示

Railsにおける確認画面を経由したフォーム処理の実装とリフレッシュ問題の解決方法

## はじめに:
Railsでのフォーム処理において、ユーザー入力の確認画面を挟むことは一般的な要件です。しかし、この確認画面でのブラウザのリフレッシュ(F5)操作が引き起こす問題には注意が必要です。この記事では、予約システムにおいて`new`アクションから`create`アクションに至る過程で確認画面(`confirm`アクション)を設けた場合の具体的なエラーとその解決策を解説します。

## エラーの状況:
– **エラー内容**: `ActionController::ParameterMissing in ReservationsController#confirm`
– **発生条件**: 確認画面でブラウザをリフレッシュすると発生

## エラーの原因:
このエラーは、確認画面でリフレッシュ操作を行った際に、フォームから送信されたデータが無くなるために発生します。`params.require(:reservation)`が期待する`reservation`キーがパラメータに存在しないため、`ParameterMissing`エラーが引き起こされます。

## 解決策の概要

元記事を表示

debug gemの活用

### 概要
Railsのdebug gemについて、デバッグ時に活用できると感じた機能を掻い摘んでご紹介します。

### 利用方法
デバッグしたい箇所に`binding.break`を記載
※ `binding.b`でも可

“`ruby
def hoge
binding.break #ここで処理が中断される
# …
end
“`

#### 基本コマンド
`c` / `continue` 処理続行(ブレークポイントがあれば再度そこで停止)
`n` / `next` ステップオーバー
`s` / `step` ステップイン

### 業務で活用できそうなデバッグコマンド

– `do, if`
特定の条件でデバッグ
“`ruby
# 特定の例外時にデバッグ
binding.break do: ‘catch ActiveRecord::RecordNotFound’

# 特定の条件でデバッグ
binding.break if val == “hoge”
““

– `i`
現在

元記事を表示

Ruby Rails そのCSVどんな文字コードだろうと取り込んでやるよ

# 文字コード…
…日本で開発をしている皆さん。こんにちは。文字コードです😈

# もう嫌なんだ
– CSVが取り込めない?
– 文字コード?
– UTF-8?
– SHIFT-JIS?
– BOM?
– BOM付?え?
– ローカルではいける?
– あの人は取り込めないらしい?
– Macならいける?
– Windowsならいけない?
– エクセルで開いた?
– メモ帳で保存して?
– スプレッドシートから出力?
– 取り込めないんですけど😡?
– こっちでは取り込めるんだよなあ?
– ああああああああああああああああああ

# どんなものでも取り込めるそんな魔法のような実装はないのかね
あるかもしれない、ないかもしれない。
僕が辿り着いたところはここまでだ。
効率がいいか?そんなことはしらん。
いいから魔改造だ!

“`rb
require ‘csv’
require ‘nkf’

def import_csv(file_param)
# どんなものでも取り込めるように魔改造
file_encoding = NKF.guess File.read(file_par

元記事を表示

Gemfileに追記せずに、自分だけ使うgemを追加

Railsのプロジェクトで、
peformance測定とか、debugのgemを入れたいとか…
チームの方針で`irb`になっているが、自分はpryを使いたいときとか…

## 方法1. `.pryrc`からinlineで呼び出す

“`~/.pryrc
require ‘bundler/inline’

gemfile do
source ‘https://rubygems.org’
gem ‘awesome_print’
gem ‘pry-doc’
end

AwesomePrint.pry!
“`

## 方法2. `Gemfile.local`を作成する方法
1の方法だと、rails serverを立ち上げたときなどは、gemが呼び出されません:cry:
なので方法2を紹介しますが、ちょっと複雑なので、基本的に方法1をおすすめします

### 1. プロジェクトのルートディレクトリに`Gemfile.local`を作成
“`Gemfile.local
gem ‘awesome_print’
gem ‘pry-doc’

eval_gemfile ‘G

元記事を表示

rails consoleのsandboxオプション、使ってる?

:::note info
1分で読めます
:::

## sandboxオプションの嬉しい点

sandboxオプションのメリットは、コンソール終了時に自動でデータベースへの変更をロールバックできる点です。

「手元で更新とか色々試したいけどデータベース変更したくないよ〜」という場合に便利。

そうでなくても誤って操作する可能性もあるので、とりあえずこのオプションで触っておけば
ローカル環境のデータに影響が出ることはないので嬉しいですね。

## 使用方法

いつものコンソールを起動するコマンドに`–sandbox`でオプションをつけるだけ。

“`
rails console –sandbox
“`

※`rails c -s`でも可能

## 注意点

ただし本番環境で使う場合は注意をしましょう。
大規模な障害につながる危険性があります。

https://zenn.dev/shuhei_takada/articles/18ba8524049a04

元記事を表示

【Ruby on Rails】paramsを使ってURLとDBを紐づけてデータを表示させる

## 今回の目標
URLが`localhost:3000/tests/1`の時は`testsDBのid:1`のデータを表示
URLが`localhost:3000/tests/2`の時は`testsDBのid:2`のデータを表示

といった形にする。

**基本条件**
・rutes.rb
・tests_controller.rb
・show.html.erb
・Testモデルtestsテーブル
それらが存在している

### やること
:::note info
①ルーティングの設定を追加
②コントローラーを作成
 params変数を学ぶ
③確認
:::

## ①ルーティングの設定
1つずつルーティングを設定していくとした場合
“`routes.rb
get “tests/1” => “tests#show”
get “tetss/2” => “tests#show”
get “tests/3” => “tests#show”

#それぞれのURLに対してtestsコントローラーのshowアクションを実行する
“`
これでも問題ないが、DBに対応という部分を考え

元記事を表示

【Rails 備忘録】 画像設定ボタンを画像に置き換える方法

画像設定ボタンが無骨だったので、画像に置き換える方法を調べたので共有します。

## 方法
jsファイルで画像のIDを読み取り、クリックされると画像設定ボタンがクリックされたことにします。

## jsファイル
“` Javascript
function imageclick(){
// 画像のid取得
const setImage = document.getElementById(‘imagePreview’)
// 画像にクリックイベントをつける
setImage.addEventListener(‘click’, function() {
// 画像がクリックされたらボタンのidを取得 クリックイベントを発火させる
document.getElementById(‘fileInput’).click();
})
}
// Event lisnersに登録
document.addEventListener(“turbo:load”, imageclick);
“`

## HTMLファイル

“` HTML
= form_with m

元記事を表示

railsAPI+Next.jsでのdevice_token_authを使ったログイン機能作成の備忘録

初の個人開発でのポートフォリオ作成でログイン機能作成時に結構詰まったので記事にします。
注意:初めての個人開発なので間違ってたり効率的でない部分も多々あると思いますので、ふーんこういうのもあるんだくらいで見ていただけると幸いです。

バージョン
Next.js  14.1.4
RailsAPI 7.0.8

参考記事

https://qiita.com/kazama1209/items/caa387bb857194759dc5#

上記の記事を参考にしてログイン機能を作成しました。
上記の記事とまったく一緒の部分は割愛します。

# RailsAPI
・`app/models/user.rb`に`:confirmable`を設定することで、メール認証が可能になります。(自分の環境だとletter_openerを設定してもメールが確認できなかったので外してます。)
・`app/models/user.rb`以下のように逆転して記載するとエラーが起きるという記事を見たので注意して下さい。
“`app/models/user.rb
class User < ApplicationRec

元記事を表示

【Rails版】半年で学んだより良いコードを書くためのTips10選

## はじめに
半年で学んだシリーズになります。
前回は汎用的なことについて書いたつもりなので、こちらはよりRailsに寄せました。

前回の記事はこちら↓

https://qiita.com/yocchan_qiita/items/06069af2d16356275469

また気になる点はぜひコメントいただけますと嬉しいです。
それでは、いきましょう!

## Ruby on RailsのコードをよくするTips10選
1. `boolean`型を返す関数の末尾に`?`をつける
1. `boolean`型が入っている変数は`is_`で始める
1. 基本関連付けを使ってデータを取得する
1. バリデーションのテストは書かない
1. ActiveRecordはデフォルトでID同士を比較する
1. mapメソッドに置き換えよう
1. 展開してスッキリ書く
1. メソッド名に関するその他慣習
1. FatControllerを解消する
1. FatModelを解消する

### 1. `boolean`型を返す関数の末尾に`?`をつける
タイトル通りで、`boolean`型を返す関数の末

元記事を表示

【Ruby on Rails備忘録】 コメント機能 返信機能つき

## 初めに
レシピ投稿サイトを作成中の初学者です。
自分の記録のために書いてますが、どなたかの参考にもなれたのなら幸いです。

## 前提
コメントモデルは作成されているものとして進めていきます。
コメントモデルのカラムは以下のように設定しました。

“` Ruby
create_table “comments”, force: :cascade do |t|
t.text “body”
t.datetime “created_at”, null: false
t.datetime “updated_at”, null: false
t.integer “recipe_id”
t.integer “user_id”
t.integer “parent_id”
t.integer “reply_to_id”
end
“`

後にこのカラムの意味は解説します。

## モデルにアソシエーションの追加

userモデルとrecipeモデルに関連づけます

“` Ruby:app/models/recipe.rb
cla

元記事を表示

OTHERカテゴリの最新記事