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

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

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

元記事を表示

【Rails】バリデーションのカスタムコンテキストon:を複数同時に指定したい場合の方法と仕組み

Railsでは、`on:`を使うことで、バリデーション実行タイミングを指定できたり、カスタムコンテキストとして実行するかしないかを調整できます。

https://railsguides.jp/active_record_validations.html#on

`on:`で定義したカスタムコンテキストを`valid?`等の引数に渡すことでバリデーションのチェックができます。
Railsガイドでは`valid?(:xxx)`の使い方が載っていますが、一度にカスタムコンテキストを複数指定する方法を書いておきたいと思います。

## 結論

結論としては、配列で指定してあげれば良いです。

“`ruby:controller
def create
book.valid?([:xxx, :yyy])

end
“`

“`ruby:book.rb
with_options on: :xxx do
validates :title, presence: true
…略
end

with_options on: :yyy do
validates :cont

元記事を表示

Rails 【where】日付・時間を範囲指定する際の注意点

## 行いたいこと
– where句を使用し、モデルのdeadline_onカラムから期日が近いデータを取り出したい。

## 完成形のコード
“`
model.where(deadline_on: Date.today..Time.now.end_of_day + (2.days))
“`

## 元々書いていたコード
“`
model.where(deadline_on: Time.now.end_of_day + (2.days)..Date.today)
“`
## 沼ったポイント
– 上記の元々書いていたコードでirb上でSQL文を確認していた際、BETWEEN節があったため問題ないと考えていた。
– 実際には、完成形のコードのように日時が早いものを先に後のものを後ろに記載しないと○日~○日までというような範囲指定はされないので注意が必要。

元記事を表示

Basic認証

# ユーザー認証を導入

## 開発環境で環境変数を設定
※macOSがCatalina以降の場合

たとえば

「xxxx」というユーザー名と
「0000」というパスワードにて、設定をする場合。

##### ①ターミナルで以下を実行する
“`Terminal:ターミナル
vim ~/.zshrc
“`
すると、「~」が縦に大量に表示される。

##### ②「i」を押下し「インサートモード」にする
「– INSERT –」と最下部に表示される。

##### ③zshの内部に、以下の記述を追加
“`Terminal:ターミナル
export BASIC_AUTH_USER=’xxxx’
export BASIC_AUTH_PASSWORD=’0000′
~
~
~
~
— INSERT —
“`

##### ④インサートモードを終了
「escキー」→ 「:wq」→「Enterキー」を押して終了。

##### ⑤sourceコマンドを実行
“`Terminal:ターミナル
source ~/.bash_profile
“`

#

元記事を表示

【AWS】AMI作成後、502 Bad Gatewayエラーが発生する場合の対処方法

# 概要
ALBの振り分け先WEBサーバを複数用意するため、
– 既存のEC2インスタンスのAMIを作成
– 新規インスタンス起動時に上記で作成したAMIを利用
– ALBのターゲットグループに新しく作成したインスタンスを追加

した上でアクセスすると、
> 502 Bad Gateway

のエラーが発生し、アクセスできない状態となった。

# 環境
– アプリ
– ruby 3.0.2
– rails 6.1.4
– mysql 8.0.31

– EC2AMI
– Amazon Linux2 AMI
– app server : Unicorn
– web server : Nginx

# 原因
– AMI作成時、作成元のEC2インスタンスは再起動される
– サーバの再起動により、Nginxが停止したことで、そもそもアプリが起動しておらず、接続できなくなっていた

> 参考

https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-

元記事を表示

GoogleスプレッドシートAPIでforbidden: The caller does not have permission (Google::Apis::ClientError)が出た時の対処法

# どうした?

[こちらの記事](https://qiita.com/kazama1209/items/a08fe0d25384b4a6ea99)を参考に自作のスプシAPIに対してActive Jobを実行したところ、以下のようなエラー文が返ってきました。

“`
forbidden: The caller does not have permission (Google::Apis::ClientError)
“`

# 解決方法
エラー文を意訳すると「スプシへのアクセス権が無いよ」とのことなので、スプシの共有設定を変更してあげます。
スプレッドシートの右上にある`共有`ボタンを押し、下図の赤枠の箇所を設定します。

![スクリーンショット 2022-11-10 15.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b364975f-3d34-42a2-19ea-2579027f2426.png)

これにてAPIがスプシにアクセスし、ジョブを実行することができます。

元記事を表示

OTHERカテゴリの最新記事