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

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

UberEats風SPAチュートリアルの復習メモ:1章

https://www.techpit.jp/courses/138
Reactの基礎になれるためにこちらの教材をやってみました。
以下、要点確認用のメモです。


# 1章 要件定義

# 1-1 構成

– 店舗一覧(/restaurants)
– レストランを一覧表示
– レストラン1をクリックするとレストラン1の商品一覧ページ(/restaurant/1/foods)に遷移
– 商品一覧(/restaurants/{id}/foods
– 販売してる商品を一覧表示
– 商品をクリックすると仮注文のモーダルが表示される
– 仮注文モーダル
– 数量の+-ボタン
– 数量に応じて金額を計算して表示
– 最初から購入数を選べるようにする(+-何回も押さなくて良いように)
– 注文確認画面
– 仮注文した複数商品の合計金額+配送料を計算、表示
– 注文確定のボタン

例外パターン

複数の店舗で仮注文しようとする可能性

解決策⇨別店舗で注文するかどうか確認するモーダルを表示する

– 店舗Aの仮注文がある

元記事を表示

【個人開発】フードデリバリー配達員の情報交換サイトを作りました。

# サービスの概要
【サイト名】
Fodeli Online

https://fodelionline.site/

![スクリーンショット 0004-02-24 4.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1794066/80a8464a-0909-adfe-eb2d-8039be9f72fb.png)

【コンセプト】
フードデリバリー配達員の情報交換や交流を目的としたサービス

【サービスの開発に至るまでの背景】
私自身、2社フードデリバリーで働いていた経験があり、出来高制ということもあり、注文が来なくて稼げない時期がありました。
一般的な会社だったら上司に仕事のコツを教えて貰えたりすると思いますが、完全個人のこの仕事では基本的には自分でコツを見つけていくしかありません。
そんな中で、配達員同士がもっと気軽に情報交換ができるサービスがあったらいいなと考え、このサービスを開発することにしました。

# アプリケーションの機能

ユーザー登録機能
 ■ ログイン機能
 ■ ログ

元記事を表示

Rails list値の差分比較

## TL;DR

list – listで差分がでる

## なぜ、Rails list値の差分比較を書くことになったか

2つのケースで利用した

### 1. WebClient -> RailsAPI -> 外部APIの時のvalidationで利用

現状の実装でRailsApiServerから外部のAPIを叩く実装があり、外部APIもまだvalidation条件がふわっとしていたため、ApiServer側でvalidationを担保しようと思っての実装(Model継承してService層ににがしているので、あまり本質的じゃない)。

### 2. RSpecのresponse bodyの情報チェックの時に利用した

あまりないケースだが、credential情報をちゃんと消しているかなどの簡易チェックに結構有用だった。
また、ResponseBodyの型情報あっております!!って時のチェックでも利用した。

## 例

“`sample.rb
list_a = [1, 2, 3]
list_b = [1, 2]
a – b # [3]

obj.keys – obj_wi

元記事を表示

RSpec include matcherあるのにexclude matcherないのかと思ったら速攻作れた話

## TL;DR

Negated Matchersを利用して、matcherを作成すれば終わる。

## Exlude Matcherを作る(秒で終わる)

“`sample_spec.rb
RSpec::Matchers.define_negated_matcher :exclude, :include
“`

## リファレンスに普通に記載がある

“`
Negated Matchers
Sometimes if you want to test for the opposite using a more descriptive name instead of using not_to, you can use Matchers.define_negated_matcher:

RSpec::Matchers.define_negated_matcher :exclude, :include
include(1, 2).description # => “include 1 and 2”
exclude(1, 2).description # => “exclude 1

元記事を表示

RSpecのbefore_actionのテストrequest specで書く

### TL;DR

mock class(Controller)を作成して、routingを追加して作成する

## なぜrequest specでbefore_action を書くことになったのか

抽象化しているまたは、ApplicationControllerで全てに
適応する、メゾッドのテストを記載しないといけなくなり、controller specは使えず(anonymous controllerは利用できないため)対応を考えた。

## 想定しているcontroller

“`application_controller.rb
class ApplicationController < ActionController::Base before_action :authenticate def authenticate // headerからauth処理関係 end end ``` 上記の問題は(実装もあるがテストで)、ApplicationController をrouting実装されておらず、request specでテストが記述

元記事を表示

【Ruby on Rails】HerokuとDBの紐付け方法

前提として

・HerokuはPostgreSQLを使用しているため、もし”gemfil”の”group :development do”配下でPostgreSQL以外を設定している場合はDBが使用出来ないので、注意下さい。
※例えば、”gemfil”の”group :development do” 配下に ”sqlite” を設定しまっている場合など。この場合は、”group :development, :test do”配下に移動するなど設定変更が必要。”gemfil”を変更したら、忘れず `bundle install` か `bundle update` を実行して下さい。

## 参考にした記事

## 1. まず、HerokuとGitリポジトリを紐付ける
https://blog.tanebox.com/archives/630/

## 2. Heroku PostgresをRailsアプリで利用する手順(Rails)
https://qiita.com/NaokiIshimura/items/550ca82e8e57aaea5582

## 1. まず

元記事を表示

Rails c でテーブル情報を取得するには

テーブル情報取得
ActiveRecord::Base.connection.tables
結果
=> [“schema_migrations”, “ar_internal_metadata”, “contacts”]

列の名前取得
【テーブル名】.column_names
=> [“id”, “name”, “email”, “content”]

列の情報取得
【テーブル名】.columns
結果
=>
[#

元記事を表示

lambdaについて

## はじめに

has_manyで使われるクエリをカスタマイズしたかったので、その方法を調べたところ、初めて見る記述だったので、調べてみました。
以下に例を示します。Postに関連するlikeを作られた逆順(新しい順)で取得するための記述です。

~~~ruby:author.rb
class Post < ApplicationRecord has_many :likes, -> { order(created_at: :desc) }
end
~~~

## has_manyのスコープ
Railsガイドでは、次のように説明されています。

>has_manyで使われるクエリをカスタマイズしたい場合があります。スコープブロックを用いてこのようなカスタマイズを行えます。

引用:[has_manyのスコープについて](https://railsguides.jp/association_basics.html#has-many%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%

元記事を表示

【Rails】eager_load, preloadの解説と、それに伴うスロークエリの改善【SQL Server】

# 概要

業務でRailsにてAPI開発をしているのですが、そこでとあるエンドポイントがタイムアウトになり始め、チームで問題となったのでその調査を行ったときの備忘録的な記事になります。

主な話題としてはActiveRecordの`eager_load`と`preload`の解説と、スロークエリとなった部分を`preload`にて改善した記事になります。

また、実行環境は以下になります
**注意: DBとしてSQLServer, アダプタでactiverecord-sqlserver-adapterを使っているので、違う環境だと結果が変わる可能性があります**

– ruby 2.7.2p137
– Rails 6.0.4.4
– activerecord-sqlserver-adapter 6.0.0
– activerecord 6.0.0

# eager_load, preload, includesの復習

## eager_loadとは

`eager_load`は、`LEFT_OUTER_JOIN`で指定したデータを結合し、関連テーブルのデータ配列を取得してキャッシュ

元記事を表示

N+1問題の解決方法(初心者向け)

## 環境

Ruby 2.7.3

Rails 6.1.4

## N+1問題とは

**必要以上にSQLが発行されてしまい、パフォーマンスが悪くなる問題のこと**。

実際にN+1問題の例を以下に示す。
シンプルに`Userカラム`と`Groupカラム`が中間テーブル`GroupUser`を跨いで多対多の関係になっている。

![Database ER diagram (crow’s foot) – Database ER diagram (crow’s foot).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/125dc7d0-9a5e-1cfd-b963-9c9c3c3ea46b.png)

N+1問題について考えず、各GroupのUserに対してある処理をしたい。
以下のようにUserデータを取得するために、随所随所でSQLが発行されておりパフォーマンスが悪い。

問題のあるコード

“`ruby
Groups.each do |group|
group.users.

元記事を表示

ActiveStorageでRspec実行時に生成された画像データをテスト終了後自動で削除する方法

## 概要
`ActiveStorage`で`Rspec`実行時に生成した画像ファイルをテスト終了後に自動で削除する方法をメモとして残しておきます。
`Rails`で`Rspec`を用いてテストする際に画像を生成する場合があると思います。
その際に生成されたテスト用画像データは下記のように`config/storage.yml`に設定された保存先に保存されます。

“`ruby
test: # ‘root’にテスト時に生成された画像を保存する場所を指定している
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
“`
テストを行っていくとどんどんと保存先のストレージが生成された画像で圧迫されてしまいます。
しかし、ある設定をすることでテスト終了後はストレージをクリーンアップすることができます。

## 方法
_*spec/rails_helper.rb*_

“`ruby
RSpec.configure do |config|
config.after(:all) do
FileUtils.rm_

元記事を表示

slimの使い方

# slimとは
***Rubyのテンプレートエンジン***のことです。
erbとかあると思いますが、slimを使うと書く手間が省けて、
htmlより簡潔に書くことができます。

# erbとの書き方の違い
slimの書き方の特徴を表にして行きます。

|<>|これは使わない|
|–|–|
|<% %>|= |
|<% %>| – |
|コメント| / |
|id指定|#|
|class指定|.|

このように表記して行きます。

コードで表すと下のようになります。

“`.html

slim練習

slimテスト

“`
slimにするとこうなります。

“`.slim
h2 slim練習
.content
p slimテスト
“`
書き方としてはかなりシンプルになります。

具体的に表にしてみます。

|html(erb)|slim|
|–|–|
||/|
|class=”content”|.content|
|id=”content”|#content|

元記事を表示

link_to 〜 doの役割

実務でタイトルにあるような書き方を見たので、まとめようと思います

link_toの使い方は、ご存知かと思います。もし分からないという方がいらっしゃいましたら、[公式ドキュメント](https://railsdoc.com/page/link_to)を読んでみてくださいね!

## link_to doはいつ使われるのか
下記のコードのようなときにこのメソッドは使われます
“`
<%= link_to root_path, class: "btn btn-link" do %>

メッセージ
<% end %>
“`
このように、画像を押すと指定したパスに遷移するような実装をしたいときに使えるかとおもいます。
公式ドキュメントを見ると分かるとおもいますが、link_toの引数に画像を指定することはできないんですね。
そこで、画像を押したときに指定したパスやURLに遷移するような実装をしたい時に、このメソッドが使えるんです。

短いですが、以上です

元記事を表示

cannot load such file — gemname (LoadError)

# Gemfileに無いgemをrequire

Gemfileに書いていないGemをrequireしていた。

“`
gem list
“`

でlocal gemにあるからと言って、大丈夫と思ったのですが違ったみたい。

もし、Gemfileにないが、localにあるgemを使いたいなら、
pathを$LOAD_PATHに書く必要がある様です。
(多分Qiitaでどなたかが書かれた記事を見たがURLを失念。)

今回はGemfileに入れたいgemだったので、
Gemfileに記入して完了。

元記事を表示

三項演算子

# 三項演算子とは

if ~ else ~ を1つの文で書くときの演算子。
Rubyなどでコンパクトな表現に置き換えられる。
ternary operatorともいうので3つのものを1組にして動かすってイメージ。

“`
論理値(条件式) ? 何かをする(条件式a) : 別のことをする(条件式式b)
“`

論理値(条件式)を評価して結果が真なら 何かをする(条件式a), 偽なら 別のことをする(条件式式b)を評価してその結果を値とする。

# 少し細かく

“`
# 普通に書くとき
if 論理値(条件式)
何かをする(条件式a)
else
別のことをする(条件式式b)
end

# 三項演算子のとき
論理値(条件式) ? 何かをする(条件式a) : 別のことをする(条件式式b)

“`

“`rb
if boolean?
var = foo
else
var = bar
end
“`

“`rb
var = boolean? ? foo : bar
“`

それとメソッドの戻り値として使うこともよくあるみたい。

“`rb

元記事を表示

Ruby on Rails Zeitwerkについて

## はじめに
通常のRubyでは、親要素を継承した子要素を定義する(依存関係のある)場合はファイルをrequireして、明示的に読み込む必要があります。しかし、Railsでは、親要素のファイルをrequireせずに継承しているものがあることに気づいたので、そのことについて調べてみました。

~~~ruby
#rubyでは、本来以下のような記述が必要だが、rails では不要。
#require ‘/application_controller.rb’
class UsersCotroller < ApplicationController ・・・ end ~~~ ## 結論 Rails 6.0以降は、Zeitwerkモードでの自動読み込み(オートロード)および再読み込みの仕組みにより、requireせずとも、ファイルが自動読み込みされている。 ## Zeitwerkとは Ruby用に作成されたコードローダーの仕組み プロジェクトで定義されたクラスやモジュールを必要な時(autoloding)もしくは、事前に一括で(eager loading)読み込みます。 #### フ

元記事を表示

devise ユーザー情報変更をcurrent_passwordなしで行う。

## はじめに

Deviseのデフォルトの状態だと、ユーザーのアカウントをアップデートするには、current_passwordが必要です。
ただ名前やメールアドレスといった基本情報の編集のたびにパスワードを入力させるのは、UIの面を考慮するとあまりよろしくないです。そこで、現在のパスワードを入力しなくてもプロフィールの情報を編集できるように実装します。また、パスワードを変更する場合は、現在のパスワードを入力するような仕様にします。
![スクリーンショット 2022-02-28 0.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653944/e7349a0b-db4c-19ba-3d73-97123bc62ca0.png)

## Devise::RegistrationsController#updateの実装について
Devise::RegistrationsController#updateでは、以下のとおり、Devise::RegistrationsController#upda

元記事を表示

【Rails】Active Jobのテストの書き方

# 初めに

Active job のテストは E2E テストですることができますが、job 単体のテストをしたい時に書き方がわからなかったのでここに残しておきます。

## やりたい事

job 単体のテストを書く

## 環境

Ruby 2.7.4

Rails 6.1.3

Rspec 3.10.1

# Job テスト

まずは、spec ディレクトリの下に jobs ディレクトリを作成します。
そして、テストしたい job のスペックを作成します。

“`console:コンソール

/rails # mkdrir spec/jobs

/rails # touch spec/jobs/_job__spec.rb

“`

job がキューに入ったことの確認するテストと job が実行されているかのテストを書きます。
DeleteReviewJob は review を削除する job です

“`ruby:rails/app/jobs/delete_review_job.rb
class DeleteReviewJob < ApplicationJob

元記事を表示

mysql5.7での所有権エラーを直そう!!

# rails でmysqlを使ったらエラー出た。。

“`
Mysql2::Error::ConnectionError (Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)):
ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid)
“`
# 環境
MySQL : 5.7.37
macOS : 10.14.6
ruby : 2.7.2
rails : 6.0.3

![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1385887/c415ecdf-9903-8e9e-7e07-4d1b44601273.png)

調べると、所有権に問題があるというので、ログインするため下のコマンドを試してみました。

## まずは、ログイン
“`console
mysql –

元記事を表示

画面遷移するとjQueryが動かないときはTurbolinksが悪さをしているかもしれない

**環境:**
Ruby 2.7.3
Rails 6.1.4.4
# **問題**
jQueryを使って、例えば「ボタンをクリックしたらモーダルウィンドウが表示される」といったアクションを実装したとする。すると、最初にページに訪れたときは正常に動くのに、ページ遷移を挟んだら動かなくなり、ページをリロードするとまた動き出す…といった不具合が発生する。

サンプルはこんな形↓(「open」というIDを持つオブジェクトをクリックすると、モーダルウィンドウが表示されるような処理)

“`jsx
$(function () {

$(“#open”).click(function(){
—–処理——
});

});
“`

# **原因**

**Turbolinksがjsの読み込みを邪魔している。**

まず、

“`jsx
$(function() {});
“`

1行目のこれはコードの省略形で、正確に書くと以下のようになる。

“`jsx
$(document).ready(function {

//処理

});
“`

元記事を表示

OTHERカテゴリの最新記事