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

Rails関連のことを調べてみた2022年10月30日
目次

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

# エラー内容
– railsでサーバーを起動しようとしたところ下記エラーが発生

“` ターミナル
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
“`

# 原因
– mysql.sockファイルがないと言われているよう
– ファイルが突然消えることがあるらしい

# 対処法

– mysql.sockファイルを作成
“`
$ sudo touch /tmp/mysql.sock
“`

– MySQLを再起動
“`
$ sudo mysql.server restart
“`

無事サーバーに接続できた。

[参考にしたサイト]https://zenn.dev/ogakuzuko/articles/6958a35833d4fd

元記事を表示

【完全SPA】独学・未経験者が「防災啓発」アプリを開発した話(2/2)【Rails/Nuxt.js/AWS/Docker/CircleCI/Terraform】

## 記事の内容

業界未経験がWeb系エンジニアになるべく作成したポートフォリオに関して、以下の情報を2つの記事に分けてまとめます。

1. ポートフォリオの紹介
2. 利用してもらった感想 と フィードバックによる改善
3. 技術選定理由 と 使用した教材の紹介
4. 反省 と 今後の課題

本記事では、 3 と 4 について記事を書かせていただきました。
1 と 2については、[こちら](https://qiita.com/kazuki-ayimon/items/a1b0c76a634663654cbf)に書いております。
最後まで読んでいただけると嬉しいです!

## 技術選定理由と使用した教材

[こちら](https://qiita.com/kazuki-ayimon/items/a1b0c76a634663654cbf)にまとめた技術に関して、**それぞれの選定理由と私が実施した学習方法**について、説明します。
また、各技術の基礎知識について、私なりにわかりやすくまとめたQiitaの記事も載せておくので、参考にしていただけると幸いです。

***

### 基礎知識

元記事を表示

【Rails6 & Docker】yarnのバージョンが古いとエラーが出た場合にしたこと

## Dockerでrails6の環境を構築した。
以下の記述でrails6の環境を立ち上げました
“`
# Dockerfile
FROM ruby:2.6.5

RUN apt-get update && apt-get install -y sqlite3 build-essential libsqlite3-dev
RUN curl https://deb.nodesource.com/setup_18.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add –
RUN echo “deb https://dl.yarnpkg.com/debian/ stable main” | tee /etc/apt/sources.list.d/yarn.list

RUN apt update && apt install -y nodejs yarn

RUN mkdir /app_name

ENV APP_ROOT /app_name
WORKDIR $APP_ROOT

ADD ./

元記事を表示

[Rails]whereが返すのはSQLの実行結果ではなくActiveRecord::Relationのインスタンス

## この記事について
ActiveRecord::Relationの理解をちゃんとできておらず、debugにハマったことがあったので備忘として残すもの
※網羅的に解説しているというよりは、見落としていた所について調べたことをまとめるものです。

## 参考書籍
– [パーフェクトRuby on Rails](https://gihyo.jp/book/2020/978-4-297-11462-6)
– [ActiveRecord::Relation](https://api.rubyonrails.org/v7.0/classes/ActiveRecord/Relation.html)

## ActiveRecord::Relationとは
RailsのO/RマッパーであるActiveRecordにおいて定義されているクラスの一つです。
表題で「whereが〜」と書いていますが、そもそもwhereはActiveRecord::Relationで定義されているメソッドであり、実行結果としてAcitveRecord::Relationのインスタンスオブジェクトが返ってきます。

今回

元記事を表示

WEB開発をやり始めてみる(Rails①)

# やったこと
“`ruby:
### コントローラーの作成
$ rails g controller Tasks

### モデルの作成
(DBのカラムを定義しています。titleはstring型,completedはboolean型で保存されます)
$ rails g model Task title:string completed:boolean
“`
“`ruby:
/db/migrate/xxxxx.create.tasks.rb
### DBマイグレーションの前に下記のように修正を行う(completedはデフォルトでfalseになる)
class CreateTasks < ActiveRecord::Migration[7.0] def change create_table :tasks do |t| t.string :title t.boolean :completed, default: false t.timestamps end end end ``` ```ruby: ### DBに反映

元記事を表示

クレジット決済サービス(pay.jp)の実装

# はじめに
pay.jpを用いたクレジットサービスの実装手順を記録に残したいと思います。
なお、購入金額を記録に残すMVCの一連の流れは、すでに実装できているものとする。

## 1.クレジット決済サービス実装の流れ
2018年6月から、APIが提供する安全な処理を利用して、クライアントサイド側でカード情報を決済サービス側に送りトークン化し、そのトークン情報をサーバーサイドに送信して決済処理を行うことが義務付けられている。
つまり、アプリケーションのサーバーサイドにおいて、クレジットカード情報を保持しないようにすることが義務付けられた。

– トークンとは
セキュリティーを担保するために用いられる、一度だけ使用可能なパスワードのこと。
今回使用するトークンは、クレジットカード情報を暗号化したもの。
同じカード情報で複数回決済をしたとしても、毎回異なるトークンが発行される。

– クレジット決済の流れ
①クライアントサイド側で、PAY.JPのAPIが提供する安全な処理を用いてクレジットカード情報のトークン化を行う。
②そのトークンをサーバーサイドに送信し、クレジットカード決済が行われる

元記事を表示

[Rails] enumを使用したステータスの更新・連動

## はじめに

 今回、とあるアプリケーションの製作過程で個人的に苦戦した、enumを使用した注文ステータス、製作ステータスの更新・連動についてメモ程度にまとめました。

## 行いたいこと
– ①注文ステータスを[入金待ち]から[入金確認]へ更新した際に製作ステータスを自動的に[製作不可]から[製作待ち]に更新させる。
– ②紐付いている注文商品の製作ステータスが一つでも[製作中]になったら、注文ステータスを[製作中]に自動的に更新させる。
– ③紐付いている注文商品の製作ステータスがすべて[製作完了]になった際、注文ステータスを自動的に[発送準備中]にする。

## モデルの準備
各モデルの内容は以下になります。
“`order.rb
has_many :order_details, dependent: :destroy
enum status: { payment_waiting: 0, payment_confirmation: 1, in_production: 2, preparing_delivery: 3, delivered: 4 }
#status → 注文

元記事を表示

【個人開発】スポーツ分析を投稿するサイトSporsHack(スポーツハック)をリリースしました

# 背景
遡ること3年前、とある企業のインターン最終面接。

私: 野球アナリストになるために御社でデータ分析を学びたいです。
面接官: 情熱に溢れているね〜。野球アナリストになるためにはデータ分析を学ぶことが最適なの?スポーツ分析を投稿するサイトを作り、スポーツアナリストを輩出する側に回ることもできるよ。
私: そういった視点もあるのですね。今は分析を学びたいので、時が来たらスポーツ分析を投稿するサイトを作ってみます。

インターン中、幸運にもプロ野球球団にシステムを提供する会社から内定をいただき、野球アナリストになること・プロ野球球団に入団するための好スタートを着ることができました。
5ヶ月間の研修を終え、プロジェクトにアサインしたのですが、Rails触ったことないとなり、3年前に面接で言われたサイトを勉強を兼ねて作ってみました。

# 開発の目的
– 実務で使用する技術を自分のペースで学ぶため
– Web開発を一通り経験することで全体像を掴み、どのフェーズの仕事を任せられても対応できるようにするため
– スポーツ分析を投稿するサイトがなく、同じ志を持った人が集まるプラットフォーム

元記事を表示

数日に1回Herokuアプリのメモリが溢れてサーバーが落ちる原因がGoogleのクローラだった

RailsアプリをHerokuのHobby Dynosでデプロイしていて、数日に1回くらいのペースで急激にメモリがオーバーしてトラフィックをさばき切れていない問題が今まで起きていて、気になっていた。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628412/bff55559-d3e1-c1fb-bdce-9408cf5ba5ee.jpeg)

これは自分のコーディングスキルが低くてなんか変なデータの呼び方をしてしまっているんだろうなと思っていたが、ログを追ってみると特定のユーザー(クライアントID)が複数ページにまたがる、とあるデータを片っ端からリクエストしていることが判明。それも3秒に1回くらいのペースなので、人間がやっているとしたら故意にサーバーに負荷をかけようとしているに違いないような挙動だった。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628412/99d763da-a086-c9a2-c

元記事を表示

Railsアプリ向けOGP生成

Controller&Viewのようなイメージで、SVGでテンプレートを用意して、OGP画像をレンダリングするライブラリを書いてみました。

# 使い方

– app/ogps/***_ogp.rb OGP生成するコード (Mailerのようなイメージです)
– app/views/opgs/***.svg.erb SVGテンプレート

“`ruby:app/ogps/question_ogp.rb
# frozen_string_literal: true

require Rails.root.join ‘lib/ogp/base’

class QuestionOgp < Ogp::Base def render(question) @question = question end end ``` ```ruby has_one_attached :ogp : question.update ogp: QuestionOgp.render(question.decorate) ``` # コード ```ruby:lib/ogp/base.r

元記事を表示

【Rails】ActiveRecordを継承しないモデルのバリデーションはActiveModel::Modelをincludeしよう

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## NGパターン

Parameter層(ActiveRecordを継承しないモデル)で、独自で必須のバリデーションメソッドをつくらない。

“`ruby
module Parameters
class PostParameter
attr_reader :params

def initialize(params)
permitted_params(params)
validate!
end

def attributes
{
title: params[:title],
content: params[:content]
}.compact
end

private

def validate!
if params[:title].blank?

元記事を表示

タイトルを動的に出力する

# タイトルを動的に出力する
タイトルとは、ブラウザのタブ部分に表示される部分。

## 実装の手順
①ヘルパーメソッドを追加する
②レイアウトのタイトルを変更する
③各ページのタイトルを設定する

## ヘルパーメソッドを追加する
タイトルを組み立てるヘルパーメソッドを追加する。

“`app/helpers/application_helper.rb
module ApplicationHelper
def page_title(page_title = ”)
base_title = ‘RUNTEQ BOARD APP’

page_title.empty? ? base_title : page_title + ‘ | ‘ + base_title
end
end
“`

条件式(.empty?) ? trueの処理 : falseの処理と言う記載を使って1行で済ませている。

コード量を減らせるため三項演算子はよく使われるが、わかりづらい場合は以下のコードでもok。

“`
if page_title.empty?
base_title
e

元記事を表示

商品がない場合は以下のダミー商品が表示されるようにする

結論
if文を使う
“`ruby
#空でなければ表示する
<% if @items[0] != nil %>

#空の場合表示する
<% if @items.length == 0 %>
“`

元記事を表示

【RSpec】Capybaraシステムテストで要素クリックが失敗したら確認したいこと

## 概要
Ruby on Railsで開発したアプリのシステムテスト実行時に、Capybaraの使い方で少し躓いた点を書いた記事です。

html要素をクリック出来ずにテストが失敗した原因と解決方法を簡単にまとめました。

もし、同じ内容でテストに失敗した方のご参考になれば幸いです。

## テスト概要
– ハート文字をクリックするといいね/いいね解除できること

今回開発したアプリにはいいね機能を実装しており、ハートをクリックすることでいいねといいね解除ができるようにしました。

## テスト・エラー詳細

下記コードを実行。
“`ruby
RSpec.describe ‘Comments’, type: :system do
# 投稿をいいね・いいね解除できる
it ‘user can like the post’ do
click_link ‘♡’
expect(page).to have_button ‘♥’

click_link ‘♥’
expect(page).to have_button ‘♡’
end
end
“`

元記事を表示

fixture_file_uploadメソッドを使用してテストコードを書く

# Formオブジェクトを導入してテストコードにエラーが出た

テストコードを打ち込む際にエラーで悩まされていたのですが、Formオブジェクトを導入すると以下のように
fixture_file_uploadメソッドを使用しないと行けないという事が分からずに時間をかけてしまいました。
以前はafterメソッドを使用してダミー画像をFactoryBotで用意していたのですが
“`ruby:FactoryBot
after(:build) do |item|
item.image.attach(io: File.open(‘public/images/test_image.png’), filename: ‘test_image.png’)
end
“`
Formオブジェクトを導入すると上記の方法ではダミー画像を使用できませんでした。

# fixture_file_uploadメソッド

調べてみると下記のようにRSpecにfixture_file_upload(該当ディレクトリの画像ファイル)を使用して
インスタンス変数に代入すると良いと言うことで試してみた所無事解決しました。

元記事を表示

“Could not find [gem name] in any of the sources”のエラーが出たときの対応

# サービス環境
ruby 2.6.8
Rails 6.1.5
docker

# “Could not find [gem name] in any of the sources” 

Railsでツイッターのクローンの課題でOmniauthを使ってgit hubのアカウントでログインできる機能を作ろうとしましたが、Railsコマンド実行時に`”Could not find [gem name] in any of the sources”`のエラーが出ました。
**お前が使おうとしているgemどこにもないやねん!** と怒られましたね。w
# 原因
`gemfile`の周りが怪しいと思って、`Omniauth gem`の各依存を調べたりして色々試してみましたが、解決できませんでした。
それで、疑惑の領域を広げて、Railsのコマンドの周り、`docker-compose`のコマンド等について調べた結果、やっと原因がわかりました。

原因は`Docker-compose.yml`ファイルでした。
課題を始める時に、Dockerの学習が終わった段階だったので、
`Dockerfile`

元記事を表示

【初学者】Rails、Next.js、Auth0のアプリケーションで、Access Tokenを利用して、バックエンド側(Rails)でメールアドレス(email),ユーザ名(name),アイコン(picture)を取得する方法

[こちら](https://qiita.com/KNR109/items/ca48c2578cc891674575)の記事を参照して、アプリを作成しておりましたが、
バックエンド側で認証したユーザのユーザ名とアイコンを取得しようとした際に、
ちょうど良い記事が見つからず手間取ったので、メモも兼ねて投稿いたします。
初学者のため、誤り等があればご指摘ください。

### やりたい事
Access Tokenに、ユーザ名、アイコンのデータを付与することで、Rails側でデコードした際に、ペイロードからその情報を取得できるようにする。
下記のチュートリアルでいうとverify_tokenのところで取得できるはず。

https://auth0.com/blog/building-secure-apis-with-rails-6-and-auth0/

### 手順① Auth0のRulesを開いて、Createを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710784/53768ec

元記事を表示

.ruby形式のビューを活用する

RailsのビューをRubyで書く、`.ruby`というものの存在を知ったので、少しまとめてみます。

## ビューの二重拡張子

Rails de使うビューには、`index.html.erb`とか`show.json.jbuilder`のように、二重の拡張子が付与されています。このうち、前半の`.html`や`.json`は、レスポンスの形式を表すものであり、後半の`.erb`や`.jbuilder`は、テンプレートを処理するハンドラーの指定です。

ここで言及する`.ruby`も、そんなハンドラーとして使えるものです。

## 使い方

他のビューと同じように、`app/views/controller_name/action_name.response_extension.ruby`のようなビューファイルを作成して、その中には好きにRubyコードを書けます。

そして、出力は、メソッドを書く時と同様な感じで、ビューファイルの最後の行で実行した内容となります。

## メリット

Railsの出力を構築する方法としては、「他のハンドラー形式を使用する」「`render`や`sen

元記事を表示

N+1問題をincludesメソッドで解決

N+1問題とは、アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題のこと。
“`ruby
モデル名.all
“`
としてしまうと、N+1問題にひっかかる。
それを解消するためにincludesメソッドがある。
“`ruby
モデル名.includes(:紐付くモデル名)
“`
と書けばよい。

例:フリマアプリ
“`ruby
class ItemsController < ApplicationController def index @items = Item.includes(:user) end ``` で、ビューでeachメソッドを使ってインスタンスを取り出す。 ```ruby app/views/items/index.html.erb <% @items.each do |item| %>
<%= item.text %>
<%= item.name %>
<% end %>
“`

元記事を表示

ファクトリーボットにアクティブストレージを記述する。

 モデルの単体テストを行う場合、ファクトリーボットにテスト項目を載せるわけだが、アクティブストレージを使用した際にどうやってテストを行ったか書いておこうと思う。
① ![スクリーンショット 2022-10-27 13.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/67bf33d8-4c5a-137e-8395-28bdf7d66735.png)
こんな感じで、fixturesフォルダを手動で作成し、その下にfilesフォルダを作成する。
② filesフォルダに、なんでも良いのでtest_image.jpgという名前で画像を配置する。
③ Furima>specmodel>item_spec.rbに以下のように記述。
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.image = fixture_file_upload(

元記事を表示

OTHERカテゴリの最新記事