Rails関連のことを調べてみた2023年07月24日

Rails関連のことを調べてみた2023年07月24日

【Rails7】renderメソッド注意点【エラーハンドリング】

Railsガイド
https://railsguides.jp/v7.0/layouts_and_rendering.html

## 結論から
エラーハンドリングをしたい場合
render :edit, status: :unprocessable_entity
この後半部分が必要です。

※Rails7で仕様が変わっています。
 以前はデフォルトでバリデーションエラーが発生した場合、自動的にこのステータスコードが設定されていました。
 よって:unprocessable_entityを明示的に指定する必要はありませんでした。

## status: :unprocessable_entityとは
HTTPステータスコードの一つで、422 Unprocessable Entityを表します。

このステータスコードは、リクエストがサーバーに到達したが、サーバーがリクエストを理解できない場合に使用されます。

一般的に、クライアントが送信したデータが不正な場合や、バリデーションエラーが発生した場合にこのステータスコードが利用されます。

## 記載しないとどうなるのか
バリデーションエ

元記事を表示

マイページを編集するときにパスワードなしで編集可能にする

## はじめに
初めまして、プログラミングスクールGeekSalonのWebコースメンターをしています。 

今回の記事は、ユーザーマイページ(プロフィールページ)を編集する際にパスワードを入力せずに編集を可能にする方法をお教えします。 

## 前提
・Railsバージョン: 5.0以上
・Deviseバージョン: 4.2以上
・ログインページが実装されている
・ユーザーマイページ(プロフィールページ)が実装されていること 

Deviseでは、アカウントをアップデートする際に、3つのパスワード情報が必要になります。

**password**
**password_confirmation**
**current_password**

パスワードを3回も打つ理由としては、**パスワードの誤入力を防止、不正なアクセスを防止**などが挙げられます。ただ、プロフィールを編集するために、パスワードを3つも入力させるのは、マジで面倒です。 

なので、パスワードなしで実装する方法をこの記事のゴールとします。

## 1.RegistrationsControllerの作成
“`
ra

元記事を表示

アクション間で同じインスタンス変数を使い回す方法

## 本記事の内容
アクション間で同じインスタンスを使いたいことがありました。
今回は、アクション間で同じインスタンス変数を使い回す方法を解説しています。

## 要件
1.ユーザー登録画面では、ユーザー名とメールアドレスのみを入力
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/e6e21e29-2e65-b582-a161-6ad67ae24eac.png)

2.入力されたメールアドレス宛に確認コードを送信、ユーザーが確認コードを入力する
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/a0f7edb8-af25-2681-b832-f51a94625c00.png)

このように、「ユーザー名・メールアドレス・確認コード」の3つを同じFormオブジェクトで管理しているが、別々のviewでそれぞれ入力したい場合があります。
この時、ユーザー登録画面から確認コード入力画面

元記事を表示

Ubuntuでdocker-compose

rails7 Ubuntuを使っています。

Gemfile
“`
gem “rails”, “~> 7.0.6”
“`

Dockerfile
“`
FROM ruby:3.1
# 公式→https://hub.docker.com/_/ruby

# Rails 7ではWebpackerが標準では組み込まれなくなったので、yarnやnodejsのインストールが不要

# ruby3.1のイメージがBundler version 2.3.7で失敗するので、gemのバージョンを追記
ARG RUBYGEMS_VERSION=3.3.20

# RUN:任意のコマンド実行
RUN mkdir /myapp

# WORKDIR:作業ディレクトリを指定
WORKDIR /myapp

# COPY:コピー元とコピー先を指定
# ローカルのGemfileをコンテナ内の/app/Gemfileに
COPY Gemfile /myapp/Gemfile

COPY Gemfile.lock /myapp/Gemfile.lock

# RubyGemsをアップデート
RUN gem upd

元記事を表示

【Rails】バリデーションをスキップ

# validate: false

– https://railsguides.jp/active_record_validations.html
>saveにvalidate: falseを引数として与えると、saveのバリデーションをスキップすることが可能です。この手法は十分注意して使う必要があります。
save(validate: false)

– こんな時に使用
– データパッチをする必要があるが、バリデーションが走り登録できない
– 仕様上、Modelに定義したバリデーションは変更したくない
“`sample.rb
ActiveRecord::Base.transaction do
# 更新
contract.assign_attributes(contract_kind: MONTHLY, updated_system: SYSTEM_NAME, updated_user: UPDATED_USER)
contract.save!(validate: false)
end
“`

元記事を表示

【Rails】メモ化

– 一度呼び出されてから結果が変わらないものはメモ化してしまう
– 呼び出されるたびにロジックやSQLが実行されるのを防ぐため、実行結果を丸々キャッシュする

“`sample1.rb
def position_chief?
@position_chief ||=
if registration_date.nil?
false
else
position = member.position
position.present? && position.chief?
end
end
“`

“`sample2.rb
def invoice?
@invoice ||= payment_date >= Date.new(2023, 10, 1)
end
“`

`||=`により
– **nil** または**false**であれば、右辺を代入する。
– **nil** または**false**以外であれば、2回目以降の呼び出し時は変数に格納された値を実行する。

:::note
メモ化によって再実行を避けることが

元記事を表示

【Rails】DRYなコード

# DRY原則-二重化の過ち
`DRY原則`(**Don’t Repeat Yourself** = 繰り返しを避けること)

:::note
システム内の二重化を最小限に抑えることを目的としている
:::

:::note warn
DRY原則を破るということは、同じ知識を2箇所以上に記述すること。
この場合、片方を変更するのであれば、もう片方も変更しなければいけなくなる。
:::

開発自体の理解とメンテナンスを容易にする唯一の方法は、DRY原則に従うこと。
「すべての知識はシステム内において単一、かつ明確な、そして信頼できる表現になっていなければならない」

:::note
既にあるものを簡単に見つけ出して再利用できるようにし、同じものを何度も作成しないような環境を構築すること
:::

# 重複しているクエリを修正する

## 最後の条件だけ違うパターン

“`共通コード.rb
transaction_arel = Transaction.arel_table
credit_arel = Credit.arel_table
shop_arel

元記事を表示

Railsにてfind, find_by, whereの違いについて

## はじめに
Railsでモデルの検索に使えるメソッド`find, find_by, where`の使い方や違いについて紹介します。
## 結論
||find|find_by|where|
|————|———|———|————|
|括弧の中に指定するものは?|id(複数可能)|条件|条件
|戻り値|条件に一致するデータ全て|条件に一致する最初の1件だけ|条件に一致するデータ全て
|戻り値の型|モデルのインスタンス (結果が複数の場合は配列)|モデルのインスタンス|`ActiveRecord::Relation`のインスタンス
|検索結果がない場合|例外発生|`nil`を返す|空きの`ActiveRecord::Relation`を返す
## 動作確認
### テストデータ
“`
irb(main):015:0> Word.all
Word Load (4.5ms) SELECT `words`.* FROM `words`
=>
[#

元記事を表示

ジャンル登録機能実装

はじめに
bootstrap導入済 
namespases使用
devaice導入済
itemモデル genleモデル 作成済
商品登録ページ作成済
________
完成イメージ
ジャンル一覧・ジャンル登録(indexページ)
![スクリーンショット 2023-07-23 13.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/f4691ccf-e93e-3ec9-e91e-32c068552689.png)
ジャンル更新ページ(edit)
![スクリーンショット 2023-07-23 13.49.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/46847e7e-69ab-a644-7453-7046e766c7cf.png)

### モデル設定
ジャンルモデル追加
“`
$ rails g model Genre name:string
$ rails db:migra

元記事を表示

EC2上にRails + Selenium + Chromeの実行環境を構築する

# 前提
– AWS EC2 : Amazon Linux 2023 AMI 2023.1.20230719.0 x86_64 HVM kernel-6.1
– このAMIじゃないとこの後実行する行うコマンドで、Google Chromeがダウンロードできない可能性があるので注意。
– Ruby : v3.2.0
– Ruby on Rails : v7.0.5
– bundler : v2.4.12
– Node : v16.20.0

Ruby on Railsが実行できる環境はすでに構築しているものとします。

`Webdrivers::Chromedriver.required_version = “114.0.5735.90”`というのを指定すると、Webdriverで自動的にChromeDriverをインストールして、それを勝手に利用するようになっていました!

以前までは`brew install chromedriver`を実行してChromeDriverをダウンロードして実行していましたが、その必要もなくなったようです。

# 環境構築

環境構築する上

元記事を表示

rails sでPostgreSQLが実行できないエラー

# 1.現状
ローカルでアプリケーションを実行しようとしたところ、以下のエラーがでました。
“`
ActiveRecord::ConnectionNotEstablished (connection to server on socket “/tmp/.s.PGSQL.5432” failed: No such file or directory
Is the server running locally and accepting connections on that socket?

翻訳
ActiveRecord::ConnectionNotsteaded (ソケット「/tmp/.s.PGSQL.5432」上のサーバーへの接続に失敗しました: そのようなファイルまたはディレクトリはありません)
サーバーはローカルで実行されており、そのソケットでの接続を受け入れていますか?
“`

# 2.直近で行った変更
AWS-s3の導入を行いました。

# 3.エラー文から考えられる原因
postgresqlが立ち上がっていないことが原因と予測しました。

# 4.解決のために行った

元記事を表示

現在のブランチを保留にして新たなブランチで作業をしたい[stash]

# 1.はじめに
作業中に別ブランチを切って作業したいときに`stash`を使用して現在のブランチでの変更を退避させることができます。
退避した変更をもとに戻して作業を再開することも可能です。

# 2.stashコマンド一覧
### 1.作業を退避させる
以下コマンドでメッセージをつけて変更を退避させることができます。
あとからみたときにわかりやすいメッセージをつけておくことをおすすめします。
“`
$ git stash save “メッセージ”

このコマンドを使うと未追跡のファイルも退避できる。
$ git stash save -u “メッセージ”
“`

### 2.退避した作業の一覧を表示させる
“`
$ git stash list
“`

### 3.退避した作業を戻す
“`
$ git stash apply stash@{0}
“`

### 4.退避した作業を消す
“`
$ git stash drop stash@{0}
“`

### 5.退避した作業の詳細を確認する
“`
$ git stash show stash@{0}
“`
以下

元記事を表示

作業ブランチを最新にする手順

### 1. masterブランチへ移動
“`
git checkout master
“`

### 2. masterを最新に更新
“`
git pull origin master
“`

### 3. 開発用のブランチへ移動
“`
git checkout 開発用ブランチ名
“`

### 4. masterの内容を取り込む
“`
git merge master
“`

### 5. 取り込んだものをリモートにpush
“`
git push origin 開発用ブランチ名
“`

元記事を表示

プログラミング学習に不安を感じている初学者さんへ

今回はたくさんの人に支えられながらプログラミングを半年やってきた僕が、初学者さんへ向けて、モチベーションなどを少しでも上げてもらえればいいなと思い記事を書かせていただくことにしました!
 
この記事はプログラミング学習等に不安を感じている方向けですので、不安なんて感じてないよって方は回れ右で大丈夫です。
 

果たしてどれだけの初学者さんがQiitaを読んでいるかは分かりませんが、少しでも多くの方に役に立っていただければと思います。
 

いくつか章があるので気になったところだけ読んでください。
 

## ここで簡単な自己紹介

* プログラミングをやりだして半年ほど経ちました。
* HTML, CSS, Ruby, Pythonをやっています。どれも好きです。
* 開発が大好きで、自分が欲しくなった機能などを作ったりしています。
* たくさんの方に支えられてここまで来ました。ありがとうございます。

では、そろそろ始めます。
 
めっっっちゃ緩いお話なのでリラックスしていきましょう!GOGO

## プログラミングはマジ余裕

もしこの円卓会議に参加している者の中に魔王

元記事を表示

コンテナが起動できないエラー  [A server is already running. Check /アプリ名/tmp/pids/server.pid.]

# コンテナが起動しないエラーが発生
`docker-compose up`コマンドでサーバーが起動しない
“`
A server is already running. Check /アプリ名/tmp/pids/server.pid.
“`

# 原因
`ctrl+c`でコンテナを停止すると`ERROR: 2`という表示がでてコンテナが停止する。
この状態だと次にコンテナを起動する際に上記のエラーが出てしまうみたいです。

# 解決策
エラー内容を確認すると、すでにサーバー起動してるよ`server.pid.`を消してねということなので下記コマンドで削除
“`
rm tmp/pids/server.pid
“`
無事サーバーに接続できました。

# おまけ
`Docker Compose V1`でこのエラーは発生しているらしいので、コンテナ起動時に`Docker Compose V2`を使用してあげれば正常に終了してくれます。
“`
docker-compose up   ←(Docker Compose V1)

docker compose up ←こっちを使

元記事を表示

deviceを使用したログイン機能

deviseを利用したログイン機能について

まずはgemfileに追加しましょう

“`
gem ‘devise’
“`
bundle installを実行するのは忘れず行う
“`
bundle install
“`
その後下記の順に行っていく
“`
rails g devise:install

rails g devise User
“`
deviseで認証するため生成されたmigrationファイル確認しnameとintroductionを追加

“`_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: f

元記事を表示

顧客マイページ作成

### はじめに
bootstrap導入済 
namespases使用
devaice導入済
新規顧客登録機能実装済
_______
完成イメージ
![スクリーンショット 2023-07-21 23.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/26ea119d-dcb0-24fc-d089-ce29fff3f0c2.png)

### ルーティング
“`routes.rb
namespace :public do
resources :customers, only: [:show, :edit, :update]
end
“`
### コントローラー
public/customers_controller作成
“`
rails g controller public/customers show edit update
“`
“`public/costomers_contoroller.rb
class Public::CustomersControlle

元記事を表示

rails モデル作成まとめ

### rails モデルについて

rails g model モデル名の後に下記のように記述すると作成されるマイグレーションファイルにカラムを追加するコードが自動で書かれた状態でマイグレーションファイルが作成される。

“`
$ rails g model モデル名 カラム名:カラムの型

# 複数のカラムも追加が可能
$ rails g model モデル名 カラム名:カラムの型 カラム名:カラムの型
“`

“`
$ rails g model Article text:text name:string
“`

– このようにターミナル上に作成すると、マイグレイーションファイルが作成される。また、作成後は`rails db:migrate `を忘れずに行う。

“`
rails db:migrate
“`
※カラムの型を書かずにカラム名だけで指定すると全てstring型になる。

– マイグレーションファイルがこんな感じで作成される。
“`ruby
class CreateArticles < Ac

元記事を表示

Rails 7のimportmap-railsとは何なのか?

# はじめに

Rails 7で`rails new app_name`をすると、`Gemfile`に`importmap-rails`が入っています。`importmap-rails`とは何なのか?

この記事では、[importmap-rails](https://github.com/rails/importmap-rails)とは何かを説明し、それを使うことによる変化を書きます。

# importmap-rails

importmap-railsは、[import maps](https://github.com/WICG/import-maps)という仕組みをRailsで使いやすくするgemです。

## import maps
import mapsとは、JavaScriptモジュールの実体とその論理名のマッピングです。例えば、以下のようにしてマッピングします。
“`html