Rails関連のことを調べてみた2022年11月21日

Rails関連のことを調べてみた2022年11月21日

デプロイをした後の運用方法

## デプロイの運用方法
今後も使う事があると思うのでメモとして残しておきます。

#### EC2へSSHでログインする
“`
username:~/environment $ ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
“`

@xx.xx.xx.xxはEC2のパブリックIPアドレス

## アプリケーションへ移動
“`
[ec2-user@ip-xx-xx-xx-xx ~]$ cd アプリケーション名
“`
## GitHubからpull
最新のコードをGitHubからpullして持ってくる
“`
[ec2-user@ip-xx-xx-xx-xx アプリケーション名]$git pull origin main
“`

## 変更したフォルダーによる運用方法
Gemfileを変更した場合
1. ローカルからリモートリポジトリへpush
2. SSHでEC2へ接続
3. EC2上でアプリケーションへ移動
4. git pullする
5. 以下コマンドを実行
“`
[ec2-user@ip-xx-xx-xx-

元記事を表示

deviseのサインアップ時に名前を登録できるようにする

deviseにてログイン機能を実装すると、
サインアップ時に登録できる情報はデフォルトとして 「メールアドレス」「パスワード」が用意される。

今回は「メールアドレス」「パスワード」に加えて「名前」を登録できるようにする。

# テーブルにカラムを追加

現状、カラムは「メールアドレス」と「パスワード」のみであるが、ここに「名前」を追加する。

:::note warn
データベースは表形式のテーブルで管理される。
この表形式の行をレコード、列をカラムという。
:::

ターミナルにて下記を実行することで、「追加先テーブル」に「追加するカラム」を追加することができる。

“`ruby:ターミナル
% rails g migration Add カラム名 To 追加先テーブル名 追加するカラム名:カラムの型
“`

名前を登録できるようにしたいため、「カラム名」を`Nickname`とする。
*「追加先テーブル名」は`User`、カラムの型は`string`とする。

“`ruby:ターミナル
% rails g migration AddNicknameToUsers nickn

元記事を表示

[sidekiq schduler]Cron形式での定期処理の書き方

## 自分用の書き方メモです。

“`
:schedule:
push_line:
cron: ‘* * 12 * * *’
class: PushLineJob
“`
– 上記のようにconfig/sidekiq.ymlに定期処理をしたいものを書きますが、cronで時間指定をする際の書き方がよくわからなかったのでメモしておきます。

## cronを用いた書き方の説明
– cronでは基本的に*を5つ用いて時間を表します。
– 左から、分・時・日・月・年で時間を指定して指定日時になったらシステムを動かすというような形で予約できます。

## sidekiqschedulerの場合
– sidekiqschedulerの場合は*が6つあります。
– 最初は何を表しているかわからなかったのですが、公式のGitHubで「一番左は秒だよ」と書いてありました。
– そのため左から、秒・分・時・日・月・年を表しています。

## 注意点
– ここまででsidekiqschdulerの時間の指定は大丈夫でしょう。
– 最後に、Railsの時間設定を共通時刻から日本時間に直す

元記事を表示

deviseを用いた「ユーザー管理機能」の実装フロー

Gemのひとつである「devise」を使用することで、「ユーザー管理機能」を実装することができる。

# deviseの実装フロー

1. Gemのインストール
2. 設定ファイルを作成
3. モデルを作成
4. テーブルを作成
5. ビューを作成

## 1. Gemのインストール
-Gemfileを編集する
“`ruby:gemfile
# 中略
gem ‘devise’
“`
-コマンドを実行
“`ruby:ターミナル
% bundle install
“`
:::note info
Gemfileに追加したいGemの名前やバージョンを記述してbundle installを実行することで、
指定したGemをアプリケーションにインストールができる
:::
-サーバーを再起動
“`ruby:ターミナル
% rails s
“`
:::note warn
下記を変更した際は、ローカルサーバーを再起動する
■Rubyバージョン
■テーブル・カラム情報
■Gemの導入状況
:::

## 2.設定ファイルの作成
“`ruby:ターミナル
% rails g insta

元記事を表示

Railsチュートリアルのrails db:seedをinsert_allで速くする

## はじめに
[Railsチュートリアル](https://railstutorial.jp/)ではチュートリアルで使用するデータを生成しDBに保存するためにrails db:seedというコマンドを使う。これが自分の古いPC環境ではなかなかの遅さだったので少しでも高速化したかった。
なお、自分の読んだチュートリアルは第4版なので、それ以外の版では事情が違うかもしれない。

対象のseeds.rbは[リスト14.14](https://railstutorial.jp/chapters/following_users?version=5.1#code-sample_relationships)。

## 環境
OS: Ubuntu 22.04
Ruby: ruby 3.0.2p107
Rails: Rails 7.0.4
SQLite: SQLite version 3.37.2

## 計測
まずはtimeコマンドで現状の計測から始めた。
“`
$ time rails db:seed
rails db:seed 80.90s user 0.78s system 66% cpu

元記事を表示

Herokuの代替先をいくつか試してはみた

自分は初心者に毛が生えた程度の知識しかないので一般的な基準ではない前提で見て欲しい。そもそもこの「Herokuの無料期間は終わるので代替先を探してみた!」って記事はさんざん書かれてるだろうから、今更ではある。

結論から書けば、**無料Herokuの代替先は現状存在しない**となる。それも「これ一つ足りない!」ではなく、どれもこれも二つも三つも足りないという印象。当然のことだが、広く使われていたとという意味で「情報量がまったく違う」というのもだいぶ大きい。

以下、とくに断りがなければ全て無料プラン前提の話をする。

# 自分に必要な要件

自分がHerokuで展開していたrailsのwebアプリに必要な要件は次のものがある

1. RailsとPostgresqlが必要
1. cronかスケジューラーとなるものが必要
1. webアプリとは別にスクリプトを回せるWorkerが必要
1. seleniumが動かせる環境が必要
1. 24時間でなくてもいいが、せめて月700時間程度は動かせてほしい

単純なアプリではあるのだが、botやスクレイピングなども行うので意外と必要な項目が多いの

元記事を表示

ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 767 bytes エラー

 Railsでアプリ作成時、rails db:migrateのコマンドの後、
Mysql2::Error: Specified key was too long; max key length is 767 bytes
というエラーが出る場合がある。
そんなときは、

<変更前>
/config/database.yml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/39dd7ce0-237e-6bdb-e8d5-ae21c4c2711b.png)

<変更後>
/config/database.yml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/6cd813bf-b8be-2a34-2db4-fed58ce4031a.png)

上記のように、databaseのencodingのところを修正することで、エラー解決ができる可能性がある。

元記事を表示

デプロイ後の運用

### デプロイ後の流れ
デプロイ後に開発環境で行なった変更を、デプロイしたアプリケーションに取り込む方法がいつもわからなくなるため、メモ代わりにまとめました。

#### ❶EC2へSSHでログインする
“`
username:~/environment $ ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
“`
:::note info
@xx.xx.xx.xxはEC2のパブリックIPアドレス
:::

#### ❷アプリケーションへ移動
“`
[ec2-user@ip-xx-xx-xx-xx ~]$ cd アプリケーション名
“`
#### ❸ GitHubからpull
最新のコードを取り込むためにGitHubからpullします。
“`
[ec2-user@ip-xx-xx-xx-xx アプリケーション名]$git pull origin main
“`

#### ❹変更したフォルダーによる運用方法
Gemfileを変更した場合
—————————
1. ローカルからリモート

元記事を表示

【Docker】mount=type=cacheの使い方【Rails】

## Dockerfile

Rails環境用のDockerfileで`$GEM_HOME`に`–mount=type=cache`を設定するには以下のようにします。

“`Dockerfile

WORKDIR /home/${USER_NAME}/${PROJECT_NAME}
COPY –chown=${USER_NAME} Gemfile* /home/${USER_NAME}/${PROJECT_NAME}/
RUN –mount=type=cache,uid=1000,target=/home/${USER_NAME}/.cache/bundle <<-EOF set -e GEM_HOME=/home/${USER_NAME}/.cache/bundle bundle install cp -aRT /home/${USER_NAME}/.cache/bundle ${GEM_HOME} EOF ... ``` 一度`~/.cache/bundle`にインストールしてから`$GEM_HOME`にコピーします。 * `GEM_HOME=/

元記事を表示

【Rails】undefined method `posts_path’ for #

# 状況
以下のようにresourcesメソッドを使って、usersの中にpostsをネストするようなルーティングを書いた。
“`ruby:config/routes
Rails.application.routes.draw do
root ‘home#show’
resources :users, only: [:show] do
resources :posts, only: [:index, :new, :create, :destroy]
end
end
“`
postsコントローラーは以下のように書いた。
“`ruby:controllers/posts_controller.rb
class PostsController < ApplicationController before_action :authenticate_user!, only: [:new, :create, :destroy] def index @user = User.find(params[:user_id]) @posts = @user

元記事を表示

管理画面

## 参考
https://techtechmedia.com/namespace-scope-module-routing/

元記事を表示

sorceryを使用して、ユーザー機能を作成しよう

## 参考
https://linyclar.github.io/rails_memos/libraries/sorcery/

元記事を表示

Active Adminで新規データ作成後に、処理を行わせる方法。

## 背景
Active Adminを利用していて、「特定のデータを作った時だけ、通知を送りたい」ニーズが発生しました。
モデル層に、:after_create_commitを置くというやり方もありますが、以下の前提があり、調べてみることにしました。
– 全てのデータ作成時に、通知するのではなくあくまで、ActiveAdmin上からデータを作成した時のみ行いたい。

## 方法
以下の方法で達成できます。
ActiveAdminで自動的に設定されているcreateメソッドをオーバーライドし、その後の後続処理を追記するやり方です。
DBに別フローでデータを作成してみましたが、ちゃんとその時は、以下のコードは動かないことを確認しているので、目的を果たすことができました。
“`
ActiveAdmin.register #{モデル名} do
controller do
def create
super do |format|
# ここに処理を入れるだけでOK!
end
end
end
end
“`

元記事を表示

【Rails】each文内の要素をjQueryでシャッフル表示させる方法

# 何がしたい?

each文で回した親要素に含まれる子要素の順番をランダムにシャッフルさせて表示させたい。

![shuffle_card.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/cb55a074-723a-8fa8-911d-f729018873ab.jpeg)

# 方法

## viewファイル

“`erb
<% # each文の周回をiとする(iの初期値は0) %>
<% @cards.each_with_index do |card, i| %>

<% # item_wrapperにRuby構文でインデックスを付与する %>

<%= card.content_a %>
<%= card.content_b %

元記事を表示

Catch allルーティングとActive Storage

Active Storageを使おうとしたら、ルーティングが干渉する事態が発生しました。

## Catch allルーティングとは

Railsのルーティングは`resources`などによるリソースフルなものや、`get ‘path/to/:id’`のようなパス形式の指定が一般的ですが、ワイルドカードを使うこともできます([Rails Guide](https://railsguides.jp/routing.html#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B0%E3%83%AD%E3%83%96%E3%81%A8%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88))。

ルーティングの一部に`*name`と入れると、スラッシュも含んでマッチしうるものがすべて回収されて、アクションの側では`params[:name]`のように取得するこ

元記事を表示

【Rails】Twitterクローンを作ってみた 〜画像アップロード(ActiveRecord)〜

## はじめに
[【Rails】Twitterクローンを作ってみた 〜コメント機能の作成〜](https://qiita.com/bloom__fu/items/87287cd705c9bad78524)の続きです。こちらを前提に進めていきますので、まだご覧になっていない方はそちらからご覧ください!※こちらはdockerでの環境構築を省きます。
## サービス環境
– ruby 3.0.0
– Rails 6.0.4
– docker
– mysql 8.0.2
– Slim, SCSS

## コメント機能作成
#### 条件
– ユーザー詳細ページの自分のアイコンをクリックでプロフィール画像をアップロードできる。
画像アップロードにはActiveRecordを使用してください。
#### 実装流れ(簡略)
① Gemfileに“`gem “image_processing”, “>= 1.2″“`を追記し、bundle install
② docker再起動
③ “`$ rails active_storage:install“`
④ db:migrate
⑤ models

元記事を表示

文字列や配列等のオブジェクト内が空かどうか確かめるためのメソッド

# はじめに
文字列や配列を格納している変数の中に、要素が存在しているか確認するケースがあります。
それをまとめたいと思います。

## メソッド名とそれぞれの機能
nil?メソッド
変数の値がnilまたは、値なしの場合、真となります。

empty?メソッド
変数の値が””(文字列の場合)や値が空白の場合、真となります。

nil?との違いは、empty?は変数の値はあることはあるが、その値が空を示している、という点です。

blank?メソッド
nil?が真となる場合、または、empty?が真となる場合に、blank?は真となります。
簡単に言えば、blank?は値といえるものがない場合、真となります。

present?メソッド
blank?とは全く逆の動作をします。present?は、値といえるものがある場合、真となります。

元記事を表示

DockerでRailsの開発環境構築するときに、今のところ安定している設定(M1 Mac)

最近、RailsのDocker開発環境をチューニングしたので、備忘録です。

# 構成
## 基本
– M1 Mac
– Ruby 3.1.2
– Rails 7.0.4
– Node 16系
– Postgresql

## その他
– webpacker(Rails7から引退したみたいなので、そのうち剥がしたい)
– solargraphもdocker
– rubocopもdockerにしたいけどしてない。

## 説明
こちらの記事を見て、volume に gem をインストールするよう bundler に設定しました。
https://zenn.dev/aldagram_tech/articles/110bc79925d41b

bundle install前に設定
`bundle config set –local path /usr/local/bundle`

docker-compose.yml
`bundle:/usr/local/bundle`

## ファイル

### Dockerfile

“`dockerfile: Dockerfile
FROM r

元記事を表示

【Rails】RspecのFormオブジェクトモデル単体テストコードのエラー

# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 前提
Formオブジェクトクラスを作成して、モデル単体のテストコードの実装を行なっていました。具体的のスクールの課題でメルカリのコピーアプリのようなものを作成していた中で、今回のテストコードの実装がありました。

# 概要
商品購入機能を実装し、購入するにあたって、
「クレジットカード情報」
カード情報、有効期限、セキュリティコード
「配送先情報」
“`create_addresses.rb
class CreateAddresses < ActiveRecord::Migration[6.0] def change create_table :addresses do |t| t.string :post_code, null:fals

元記事を表示

【RUBY】if,elseを用いたプログラム

# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 指定された2つの真偽値によって処理が異なるプログラムを実装していきます。
平日と休日によって、「その日が遅くまで寝ていられるかどうか」を判断する、sleep_inメソッドとして、真偽値によって処理が異なることを実装します。

# 第一引数の値では「平日かどうか」、第二引数の値では「休暇かどうか」をtrueまたはfalseを用いて以下のように表します。
第一引数がtrue(平日である)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がfalse(平日でない)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がtrue(平日である)または、第二引数がfalse(休暇でない)の場合はfalseと出力。
第一引数がfalse(平日でない)または、第二引数がf

元記事を表示

OTHERカテゴリの最新記事