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

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

Railsでメモ化を使ってパフォーマンスを向上させる

# TL;DR

Railsでメモ化というテクニックを使えば一度のリクエストに対して同じ処理が複数走る箇所のパフォーマンスを改善できます。
“`ruby
@hoge ||= #重い処理
“`
このようにインスタンス変数の自己代入を使ってメモ化すれば、2回目以降の呼び出しはインスタンス変数に格納された値を使ってその後の処理を実行できます。

# 解決したい課題

次のようなProductモデルを考えてみます。
“`ruby:product.rb
# == Schema Information
# id :bigint not null, primary key
# name :string(255) not null
#
class Product < ApplicationRecord has_many :shops, through: :malls has_many :malls def has_shops? # 内容は省略 # 要件を満たしたshopかどうかを判定して真偽値を返す

元記事を表示

HTTPキャッシュとRails

HTTPにはキャッシュの機能がありますが、Rails標準でも意外なところまで組み付けてあったりします。

## 記事の守備範囲

この記事では、Railsが動的に生成する箇所のキャッシュを中心に考えます。事前に生成して、送信にRailsが直接関与しないこともあるアセット類については、考慮の対象から除外します。

## HTTPのキャッシュ

まず、HTTPのキャッシュには大きく分けて2通りの役割があります。

* キャッシュがある状態で全く通信を行わず、キャッシュした結果をそのまま利用する
* キャッシュのある状態で更新確認のための通信を行い、変化がなければ再利用する

そして、キャッシュされたものには2つの状態があります。

* fresh…キャッシュを信じて、通信せずに利用して問題ないことを示しています。
* stale…キャッシュが古くなっている、という状況です。

### Cache-Controlヘッダ

HTTPキャッシュの指示のために、`Cache-Control`というHTTPヘッダが存在します。詳細は[MDN](https://developer.mozilla.or

元記事を表示

【エラー解決】Ruby on Rails いいね機能 〜まさかそこ!?ってなる落とし穴を解決する方法〜

# はじめに
Ruby on Railsを使っていいね機能を実装しているが、教材や記事通り実装しても謎のエラーに苦しめられる・・・という経験をしたことがある人を何度も目にしてきました。

今回がそういった人に向けて、よく見落とされがちなエラー解決の方法を伝授します!

# エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/da3c7de6-fa50-af17-1759-2981f97097c7.png)

# 解決方法
ルートもコントローラーの記述も全部あっているはずなのに上記のようにNo route matches と怒られる方は一度viewページを確認してみてください!
いいねボタンがlink_toになっていませんか???
“`rb:index.html.erb(変更前)
<% if @post.favorite?(current_user) %>
<%= link_to post_favorite_path(@post.id), method: :de

元記事を表示

Rack CORS

## CORSとは

CORSとは“`Cross Origin Resource Sharing“`の略語で、日本語で表すと“`オリジン間リソース共有“`です。
ブラウザでは、セキュリティの観点から異なるオリジンを持つクライアント側からのHTTPリクエストを制限しています。
これを“`同一オリジンポリシー“`と言います。

https://qiita.com/att55/items/2154a8aad8bf1409db2b

例えば、“`http://localhost:3001“`でapiサーバーが立ち上がっており、“`http://localhost:3000“`でクライアント側のサーバーが立ち上がっている場合に、クライアント側からapi側にリクエストをすると、オリジンが異なるため以下のようなエラーが出力されます。

“`
Access to XMLHttpRequest at ‘http://localhost:3001/api/v1/posts’ from origin ‘http://localhost:3000’ has
been b

元記事を表示

Stimulus 6: 外部リソースの操作

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/handbook/working-with-external-resources

前の章では値を使用してコントローラーの内部状態をロードして永続化する方法を学びました。

コントローラーは外部リソースの状態を追跡する必要がある場合があります。外部とはDOMまたはStimulusの一部にないものを意味します。たとえばHTTPリクエストを発行し、リクエストの状態が変化したときに応答する必要がある場合があります。またはタイマーを開始してコントローラーが接続されなくなったときに停止することもできます。この章ではこれらの両方を行う方法を見ていきます。

# HTMLの非同期読み込み

HTMLのリモートフラグメントを読み込んで挿入することにより、ページの一部を非同期的に設定する方法を学びましょう。Basecampでこの手法を使用して最初のページの読み込みを高速に保ち、ビューをユーザー固有

元記事を表示

Rails 一覧画面でコメント機能

Railsを使って、●イッターみたく一覧画面でコメントしてみたいなーと
思ったので作りました!!

# 前提
:::note warn
以下の項目を既に実施している前提として話を進めます!
:::
1. 投稿機能の実装
1. deviseを用いたユーザー機能の実装

# Viewの編集
HTML・Rails側で主に実施することは以下の通りです。
1. 投稿毎にコメントを表示する
1. コメントの表示・非表示用のボタンを作る
1. 各投稿を見分けるために、投稿のIDをつけておく
1. コメントのフォームを作る
1. 投稿毎にコメントできるように、各フォームでインスタンスを生成

“`diff_erb:index.html.erb

Posts

<% @posts.each do |post| %>

<%= image_tag post.image_url, class: '

元記事を表示

railsプロジェクトでctagsを準備

“`shell
ctags –langmap=RUBY:.rb –exclude=”*.js” –exclude=”.git*” -R .
“`

元記事を表示

[Rails]CSSファイルの適用について

CSSファイルの適用についてまとめたいと思います。

## CSSファイルの配置先
Railsのスタイルシートは、app/assets/stylesheetsディレクトリに配置します。

app/views/layouts/application.html.erbのhead要素にstylesheet_link_tagという記述があります。
“`ruby
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
“`
## stylesheet_link_tagメソッドとは?
stylesheet_link_tagとは、読み込むCSSファイルを指定できるヘルパーメソッドです。

読み込みたいCSSファイルをapp/assets/stylesheets/というディレクトリに配置し、stylesheet_link_tagメソッドの引数に読み込みたいCSSファイル名を記述します。

上記記述は、application.html.erb内で、stylesheet_lin

元記事を表示

【AWS】Fargate導入時にハマったことと対応まとめ

# 概要
下記の記事を参考に、RailsアプリケーションがFargate上で動作するよう設定を行ったが、そのままでは動作せず。発生した事象と対応についてまとめ。

https://qiita.com/hatsu/items/22e11e94a0a981d78efa

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

– インフラ
基本的に元記事の通り。
HTTPSでアクセスできるようSSL化まで行っている、
ローカル→(HTTPS)→ALB→(HTTP)→Fargate⇄RDS
の状態。

# タスクを起動し、ドメイン名からアクセスすると、503 service temporarily unavalibanleエラーとなる
各種設定が完了したので、Fargateを起動しようと、下記操作を実施した。
– ECS/タスク定義/アクション/タスクの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948830/0bb00b

元記事を表示

failed to push some refs to ‘URL’ について

## 概要
railsアプリの開発中にgit pushしようとしたところ、以下のエラーが発生しました。

“`
% git push origin feature/signup
To https://github.com/***/*****.git
! [rejected] feature/signup -> feature/signup (non-fast-forward)
error: failed to push some refs to ‘https://github.com/***/*****.git’
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in

元記事を表示

RubyonRailsチュートリアル:実践メモ【第一章】

Ruby on Rails チュートリアル(Webサービス開発が学べる学習サービス)に従って、MVCフレームワークアプリケーションを作成していく。

**使用ツール** :
AWS Cloud9
## ルートの設定方法
**Railsのルーティングファイル**を開き、controller_name(コントローラ名)と、action_name(アクション名)を記載する。
※Railsのルーティングファイル=config/routes.rb

↓↓↓ルーティングの文法形式
root “controller_name#action_name”

実際に当てはめると、
`app/controllers/application_controller.rb`
なので、controller_name(コントローラ名)は**application**

“`ruby:qiita.rb
class ApplicationController < ActionController::Base def hello render html: "hello

元記事を表示

イメージレイヤーを意識したDockerfileにしてRails&Webpackerのビルドスピードを上げる

# はじめに
本記事は、[エムスリーキャリア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/m3c)の15日目の記事です。

# イメージレイヤーを意識しない`Dockerfile`の例
Rails&Webpackerなプロジェクトの本番環境を構築する際、おおまかに以下のような工程になります。
1. Ruby・Node.js・Yarnのインストール
1. `bundle install` & `yarn install`で依存関係のインストール
1. `rails assets:precompile`でアセットプリコンパイル
1. `rails server`でRailsを起動

これをイメージレイヤーを意識せずに`Dockerfile`に落とし込むと以下のような構成になります。
※各ミドルウェアのバージョンは以下の想定
* Ruby 2.7.7
* Node.js 14.x

“`dockerfile:Dockerfile
# Ruby 2.7のイメージからビルドする
FROM ruby:2.7.7

#

元記事を表示

ViewComponentを使ってRubyでコンポーネント開発

はじめに

この記事はCODEBASE OKINAWA Advent Calendar 2022 15日目の記事です。
今回は自分が今プロジェクトで書いている Ruby on Rails のライブラリViewComponent の導入の仕方やメリットについて書いていきます

ViewComponent とは

Rails 6.1 からデフォルトでサポートされるようになったgithub製のgem
render partialという部分テンプレートが使用できるライブラリのより便利になったもので
Componentベースで開発するのでコードの再利用が簡単でテストもしやすいです
公式ドキュメント
https://github.com/github/view_component

始め方

まずはgemを追加します。

“`

元記事を表示

本番環境用のgemを開発環境にインストールしたくない時の対処法

本番環境ではpostgresを使いたいけど、開発環境ではsqliteを使うという場合は、Gemfileを編集して開発環境と本番環境のgemを分けるようにする。

開発環境
“`
group :development, :test do
gem ‘sqlite3’, ‘1.4.2’
end
“`

本番環境

“`
group :production do
gem ‘pg’, ‘1.1.4’
end
“`

開発環境に本番環境用のgemを入れないために以下を実行

“`
bundle config set –local without ‘production’
“`

元記事を表示

間違えてディレクトリを削除してしまったときの対処法

ファイルを削除してしまったとき

“`
rm -rf app/controllers/
“`

“`
git status
On branch main
Changes not staged for commit:
(use “git add/rm …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
deleted: app/controllers/application_controller.rb
deleted: app/controllers/concerns/.keep

no changes added to commit (use “git add” and/or “git commit -a”)
“`

その変更をgit addしていなければ次のコマンドを実行。

“`
git checkout -f
“`

これで一つ前のコミットまでワークツリーの状態を戻せる

元記事を表示

GraphQLでRailsのスキーマからフロント(TS, urql)の型生成までできるようにしてみた

## GraphQLとは何か

> GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.

*GraphQLは、APIのクエリ言語であり、既存のデータを使用してこれらのクエリを実行するためのランタイムです。GraphQLは、API内のデータの完全でわかりやすい説明を提供し、クライアントが必要なものだけを正確に要求できるようにし、時間をかけてAPIを進化させやす

元記事を表示

Railsにおけるアソシエーションについて整理する

# アソシエーションとは、モデルを利用したテーブル同士の関連付けのことである。
アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになる。

## 1:1または1:多の関係
例としてTwitterのようなアプリを作成することを仮定してテーブル同士についての関係性を書いてみる。
### has oneの関係
例1
![スクリーンショット 2022-12-15 10.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/9c4572ec-3101-f9a7-d4f1-c4a5d137e9c3.png)
上記の状態のときusersテーブルAさんはtweetsテーブルに対して一度しかツイートを投稿できないとする。
つまり、usersテーブルからみて、tweetsテーブルは **「1:1」** の関係になり、このことを、**has oneの関係**といい、「User has one Tweet」の状態であると言える。
これは1:1の関係を表している

元記事を表示

Rubyではpという変数名をなるべく避ける

Rubyプログラミングの小ネタです。

Rubyに限らずプログラミング全般の慣習として、寿命の短い変数の場合、意図的にそのオブジェクトを表す名前の頭文字1文字だけにすることがよくあります。

“`ruby
books.map { |b| b.title }
“`

しかし、Rubyではその場合でも`p`だけはなるべく使わない方が良いです。

“`ruby
# 問題なく動くがあまり望ましくない
people.map { |p| p.name }
“`

それはなぜか?`Kernel.#p`メソッドと名前が被ってしまうからです。

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/p.html

もしデバッグで`p`メソッドを使いたくなったりすると、途端にコードがわかりにくくなります。

“`ruby
# pメソッドでp.nameをターミナルに表示する(?)
people.map { |p| p p.name }
“`

Rubyは懐が深い言語なので、実は上のコードもちゃんと動きます。
気になる方は以下のコードをir

元記事を表示

better_errors 導入で Rails のデバッグを快適に!

# 概要

皆さんは `Rails` での開発の際にどのようにデバッグを行っていますか?
`puts` コマンドで確認、`byebug`、`pry` などのデバッグツールを利用する等々、方法があると思います。

今回は上記と並んでデバッグの効率を上げてくれる `better_errors` という `gem` をご紹介します。

# better_errors とは?

## どんな gem ?

`Rails` のスタンダードのエラー画面をもっと見やすく、便利なエラー画面へと変更してくれる機能になります。

https://github.com/BetterErrors/better_errors

## 動作サンプル

`Rails` のデフォルトエラー画面を見てみましょう。

– **Before**

![a4b09b13-d04e-ac35-7e50-227b9dda9139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952780/928e3995-33c7-7ab5-e22c-1

元記事を表示

gem ‘rspec-openapi’ を紹介したい

# はじめに

Request specからいい感じのOpenAPIドキュメントを作ってくれるgemのご紹介です。
バージョンアップで動作が変わることもあるので最新の情報はREADMEを参照してください。

https://github.com/exoego/rspec-openapi

## 検証環境

“`
Rails : 7.0.4
rspec-openapi : 0.7.2
“`

## インストールと実行

1\. インストール

testでしか使わないので `group: test` に追加すると良いでしょう。

“`ruby
group :test do
gem “rspec-openapi”
end
“`

2\. 実行

rspecの実行に `OPENAPI=1` を追加するだけです。

“`bash
OPENAPI=1 rspec
“`

オプションがついているだけでrspecの実行に変わりないのでファイル指定やオプションはそのまま使えます。
試していませんがCIで生成させても良いと思います。

“`bash
OPENAPI=1 rspec spe

元記事を表示

OTHERカテゴリの最新記事