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

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

Rails6とaxiosを連携させてデータを受け渡す!

## 実現したいこと
フロントエンドのデータをバックエンドに渡したい!

↓詳しく↓

JavaScriptのデータを[axios](https://github.com/axios/axios)を用いてDBに保存したい!

## 開発環境&前提条件
Ruby 3.0.2
Rails 6.1.4.4
データを保存するDBテーブル等は作成済み

## 1. axiosの導入

**インストール**
“`terminal:ターミナル
$ npm install axios
“`

**CDN**
“`html:任意のファイル

“`

## 2. Javascriptへaxiosの記載

“`javascript:任意のJSファイル
// ↓受け渡したいデータを格納
const data = { score: gameScore, user_id: “<%= current_user.

元記事を表示

【Rails】クラスメソッドとインスタンスメソッドの使い分け

## はじめに
 本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## クラスメソッドとインスタンスメソッドの使い分け

### クラスメソッドとインスタンスメソッドの違い
クラスメソッドとインスタンスメソッドの違いは

– メソッドの記述方法
– メソッドの呼び出し方法

です。

#### メソッドの記述方法
クラスメソッドの場合には以下のようにメソッド名の頭に`self`を記述します。

“`ruby
def self.exists_no_name_user?
no_name_user_list = User.where(name: nil)
no_name_user_list.exits?
end
“`

インスタンスメソッドの場合には以下のように`self`のない形になります。

“`ruby
def full_name

元記事を表示

ActiveJob でジョブのメモリ使用量がしきい値を超えた場合に通知する

# やりたいこと

– ActiveJob でジョブのメモリ使用量がしきい値以上だった場合に通知したい。
– 僕の具体的なユースケース: Sidekiq で大量にメモリを使用して、かつ解放されない場合が結構ある。そこで、具体的にどのジョブが関係しているのかを調べたい。

# 方法

– [around_perform](https://api.rubyonrails.org/v7.0/classes/ActiveJob/Callbacks/ClassMethods.html#method-i-around_perform) メソッドを使う。
– 今回は [Rollbar](https://rollbar.com) というエラーモニタリングサービスで警告を通知する。
– Rollbar.warning の部分は、環境に応じて任意の通知方法に置き換えること。

“`app/jobs/application_job.rb
class ApplicationJob < ActiveJob::Base around_perform do |job, block| Mon

元記事を表示

AWSのS3で画像が保存できない

簡易的なフリマアプリを作成中。

AWSのS3に画像を保存するための実装を実施。
必要なファイルや記述なども終え、まずローカル環境で画像がS3に保存できるかの挙動確認を行う。

が、__エラー発生。__

エラー文は以下の通り。

“`
NoMethodError (undefined method `upload’ for nil:NilClass):
“`

「スペルミスでもしたかな?」

まずは今回新たに追記した`config/environments/development`と`config/storage.yml`のファイルを見直す。
しかし特に間違っている様子はない。

次にエラー内容をgoogleにて検索。
すると、同じ境遇の方々がたくさんいらっしゃいました笑
それぞれの記事を見ていると「:が抜けている」や「””を忘れている」などの内容が多かったので、再度その辺りを確認するため、各コードを見直し。
が、やはり間違いが見当たらない・・・

S3に入る直前に挙動確認を行った際は、問題なく画像が保存されていたので、コードの書き間違いは考えにくい。
間違いがあるのはcon

元記事を表示

【RSpec】テストコードはループを使わない方がベター

# なぜループ処理を使わない方がいいのか

テストコードは仕様がひと目でわかることが大事なため、可読性が下がるループはしない方がベター

“`ruby
describe ‘#format_date_of_birth’ do
it ‘生年月日を和暦で表示すること’ do
%w(1977-06-06 1988-06-06 1989-06-06 2016-06-06).each do |date_text|
date = Date.parse(date_text)
person = Person.new(‘Taro’, date)
jp_year = date.year >= 1989 ? “平成#{date.year – 1988}年” : “昭和#{date.year – 1925}年”
expected = “#{jp_year}#{date.month}月#{date.day}日”
expect(person.format_date_of_birth).to eq expecte

元記事を表示

AWSのEC2の環境構築で参考にしたサイト(rails,docker,nginx)

以下のインフラ環境を構築するまでに参考にしたサイトをご紹介します。

# 1,AWSの全体的な知識を付けるために参考にしたもの
<動画教材>
WEBエンジニアの山浦さんのUdemyの動画教材です。
解説が初心者に優しく、わかりやすいのでおすすめです。

https://www.udemy.com/course/aws-and-infra/

<書籍>
解説がわかりやすいです。
イラスト使って説明してくれるので、なにをやっているのかイメージしやすく、すぐに読み終えることができました。

https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=sr_1_15?__mk

元記事を表示

「Herokuで画像表示できない」を解決

# はじめに
 現在オリジナルアプリの開発中です。Heroku環境でアプリをアップロードしているのですが、assetsに配置した画像が表示されないという問題がありました。解決方法がわかったのでまとめておきます。

# 問題
 app/assets/images 配下に設置した画像が表示されない。(ローカル環境では表示されている)

ローカル環境では表示されているため、本番環境では追加の設定がいるのかもしれない。と思い調べると解決方法が出てきました。

# 解決方法
 解決方法は image_tagのファイルの指定方法を修正することでした。

“`qiita.rb
<%= image_tag "/assets/top.png" ,class:"img-fluid" %>
“`

image_tagに渡す画像のバスの指定方法を間違えていました。
この書き方では、ローカルだと表示されるのですが、本番環境だと表示されません。

以下に修正しました。

“`qiita.rb
<%= image_tag "top.png" ,class:"img-fluid" %>
“`

結果無

元記事を表示

【Rails】find_or_initialize_byとfind_or_create_byの違い

# find_or_create_by

条件を指定して初めの1件を取得(find)し、1件もなければ作成(create)
作成する時に呼ぶメソッドが**create**なので、新規作成して保存まで行う

“`ruby
Category.find_or_create_by!(name: “ディナー”)
Category Load (0.6ms) SELECT “categories”.* FROM “categories” WHERE “categories”.”name” = $1 LIMIT $2 [[“name”, “ディナー”], [“LIMIT”, 1]]
TRANSACTION (0.5ms) BEGIN
Category Create (2.0ms) INSERT INTO “categories” (“name”, “created_at”, “updated_at”) VALUES ($1, $2, $3) RETURNING “id” [[“name”, “ディナー”], [“created_at”, “2022-02-21 12:19:1

元記事を表示

【Rspec,Rails】full_title helperの単体テスト

# テストの対象となる機能
application helperに次のようなfull_title helperを定義している。

“`rb:appplication_helper.rb
module ApplicationHelper
BASE_TITLE = “HOGE”.freeze

def full_title(page_title)
page_title.blank? ? BASE_TITLE : “#{page_title} – #{BASE_TITLE}”
end
end
“`
ページタイトルを取得して、ベースタイトルとともにtitleタグに動的な表示を行うために作られた、普通のタイトルヘルパーである。

Rspecによって、この機能のテストを記述したい。

# helperの単体テスト

この機能をテストを記述するにあたっては、次のように、他のviewの要素とともに、system specにテストを記述する方法もある。

“`rb:system_spec
expect(page).to have_title “#{content.name} –

元記事を表示

Rails6 Action Text と Active Storageの実装 Cloudenaryにアップロード リッチテキスト 複数画像投稿

# 環境
“`
$ rails -v
Rails 6.1.4.4

$ ruby -v
ruby 3.0.2

macOS Monterey
version 12.2
“`

デモ
![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/76d47081-5093-39a4-5c91-556302a2835a.gif)

# 参考記事
https://railsguides.jp/active_storage_overview.html

https://railsguides.jp/action_text_overview.html

https://cloudinary.com/documentation/rails_activestorage

# アプリの作成

“`
$ rails new text_strage_app
$ rails g scaffold Post title:string
$ rails db:migrate
“`

# Active St

元記事を表示

[テスト] qiita api items

テストです。

元記事を表示

【Rails】APIモードのルーティング例

## はじめに
 本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Rails APIモードのルーティング

### ルーティング例

コメントで解説を記述していますのでご確認ください。

“`config/routes.rb
Rails.application.routes.draw do
# namespaceで名前空間を付与する。
namespace :api do
# APIに大きな変更が発生する場合に備えてスイッチングしやすいようにURL自体にバージョンを持たせる。
# ただし、バージョンは「必要な場合にのみ」つけることが推奨されている。
namespace :v1 do
# resouresはindex、show、new、edit、create、update、destroyアクションに対応するルーティングを

元記事を表示

CGI.escape

CGIモジュールのescapeメソッド

“`
# @をエスケープ
>> CGI.escape(‘foo@example.com’)
=> “foo%40example.com”
# ‘とスペースと!をエスケープ
>> CGI.escape(“Don’t panic!”)
=> “Don%27t+panic%21”
“`
テストファイルでテスト用ユーザーのメールアドレスをエスケープできる
“`
CGI.escape(user.email)
“`

元記事を表示

Rails いいね機能の非同期を実装する際の注意するべきポイント

いいねの非同期を行う際、何回かエラーでつまづいた。
そんな時に確認するべきポイントをまとめる!!

##1.jQueryがちゃんと読み込まれているか

“`Gemfile.
gem ‘jquery-rails’
“`
その後、bundle install を忘れずに。

“`app/assets/javascripts/application.js
//= require jquery
//= require rails-ujs
//= require jquery_ujs
“`

“`webpacker/environment.js
const { environment } = require(‘@rails/webpacker’)

const webpack = require(‘webpack’)
environment.plugins.prepend(‘Provide’,
new webpack.ProvidePlugin({
$: ‘jquery/src/jquery’,
jQuery: ‘jquery/src/jque

元記事を表示

includesを使ってSQLの発行件数を減らそう(N+1問題)

## SQLの発行件数が多いと指摘を受ける。

業務にて、ある一覧画面を作成していたところ、
自分が書いたソースをみた先輩から、
「この一覧画面のSQLの発行件数が多すぎる。ちょっと減らしてみて。」とご指摘を受けました。

SQLの発行件数が多いのはN+1問題が起きていたことが原因で、
includesを使用することで
事象を解決できたのでアウトプットしてみようと思います。

## N+1問題とは
必要以上にSQLが実行されて、パフォーマンスが低下する問題。
今回指摘を受けた画面では、
ログを見ると、他のテーブルの情報を取得するため何度もSQLが発行されていました。

## includesとは

includesメソッドは、関連している複数のテーブルからデータをあらかじめ取得するメソッドです。

N+1問題を解決させるためには、
都度SQLを発行させるのではなく、あらかじめデータをすべて取得しておくことで解決することができます。

例えば、
UserクラスとPostクラスがあって、
投稿からユーザ名を取得する処理があったとします。

“`rb
# models/user.rb
cl

元記事を表示

assert_matchメソッド

正規表現で文字列をテスト。

assert_match( regexp, string, [msg] )

stringは正規表現 (regexp) にマッチすると主張する。

“`rb
assert_match ‘foo’, ‘foobar’ # true
assert_match ‘baz’, ‘foobar’ # false
assert_match /\w+/, ‘foobar’ # true
assert_match /\w+/, ‘$#!*+@’ # false
“`

[Rubular](https://rubular.com/)

元記事を表示

【Rails】ログイン機能をGem ‘devise’で実装

こんにちは。
早く駆け出したい修行僧です。

今回は、Gemの ‘devise’ を使ったログイン機能を学んだので、
こちらにアウトプットさせていただきます。

尚、「それは違うよ」など訂正箇所がございましたら、
愛のあるご指摘を頂けたら幸いです。

# 環境
macOS Monterey(M1) 12.2.1
ruby 3.1.0
Rails 6.1.4.6
devise 4.8.1

# ‘devise’とは
特定のページを閲覧したりユーザに制限をかけたりするためには**ログイン認証**が必要となってきます。ログイン認証とはログインやログアウトの機能を指します。
そして、それらは新規登録をしないと始まりません。そんな機能を簡単に実装してくれる優れたgemが ‘devise’ です。

# インストール
`rails new` でアプリ作成済みであることを前提とします。
まずは導入したいアプリケーションのGemfileに以下のコードを挿入します。

“`ruby:G

元記事を表示

クエリパラメータ

# クエリパラメータとは
クエリパラメータとは、URLの末尾で疑問符「?」に続けてキーと値のペアを記述したもの。

“`
…/edit?email=foo%40example.com
“`

上記の場合、?email=foo%40example.comがクエリパラメータ。

? からクエリパラメータを示して、emailがキー(パラメータ)としてfoo%40example.comを指定している。

“`
?キー(パラメータ)=キー(パラメータ)の値
“`

#### %40はURLエンコード

値の表記に使用できない文字を含めたい場合は、「URLエンコード」あるいは「パーセントエンコーディング」と呼ばれる方式で安全な文字列に変換。
これは「エスケープ」と呼ばれる手法で、通常URLでは扱えない文字を扱えるようにする。

@はURLエンコードだと%40となる。

[URLエンコード変換ツール](https://tech-unlimited.com/urlencode.html)

URLのクエリパラメータではキーと値ペアのを複数使うこともでき、その場合

元記事を表示

アプリを作る パスワード再設定のメール送信

### app/mailers/user_mailer.rb
“`rb
class UserMailer < ApplicationMailer def account_activation(user) @user = user mail to: user.email, subject: "アカウントを有効化" end def password_reset(user) @user = user # インスタンス変数に代入する mail to: user.email, subject: "パスワードをリセット" end end ``` ### app/views/user_mailer/password_reset.text.erb ```text パスワードをリセットするには、以下のリンクをクリックしてください: <%= edit_password_reset_url(@user.reset_token, email: @user.email) %>

このリンクは2時間で期限切れになります

パスワードのリセッ

元記事を表示

Rspecのallow_any_instance_ofを書き換える

# はじめに
インスタンスメソッドのスタブを `allow_any_instance_of` で書いていたのですが、どうやらこれが非推奨らしいので、これを書き換える方法をメモがてら記事にしました。

# allow_any_instance_of を使ったテスト

テスト対象のファイルはこちら

“`ruby:test.rb
class Test
def test_method
hoge = Hoge.new
hoge.hello
end
end

class Hoge
def hello
“hello!”
end
end
“`

そして `allow_any_instance_of` を使ったスペックファイルがこちら

“`ruby:test_spec.rb
require_relative ‘test’

describe ‘Test’ do
context ‘test_method’ do
before do
allow_any_instance_of(Hoge).to receive(:hello).and_

元記事を表示

OTHERカテゴリの最新記事