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

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

ActiveModelSerializerで発生したN+1問題を解決

##前提

UserとPostは1対Nの関係

“`ruby
class Post < ApplicationRecord belongs_to :user end ``` ```ruby class User < ApplicationRecord has_many :posts, dependent: :destroy end ``` ##解消前 テストログを見るとserializerが走ったときにN+1問題が発生していた。 ```ruby def index posts = current_user.posts render json: posts end ``` ##解消後 ```ruby def index posts = current_user.posts.preload(:user) render json: posts end ``` scopeに切ると他でも使えてベター ```model.rb scope :preload_user, -> { preload(:user) }
“`

“`ruby
def inde

元記事を表示

attr_writter, attr_reader, attr_accessorについて

まず、この3つのメソッド話題のときに理解していないといけないのはインスタンス変数です。
インスタンス変数とはその名の通り、インスタンスを格納している変数です。(説明になってないので、[こちら](https://qiita.com/wangqijiangjun/items/787c956dab02e516eab9)の記事をご覧ください。)

インスタンス変数というのはクラス外からは参照できないんです。
実際にコードを書いていきます。
“`
class User
def initialize(name)
@name = name
end
end

user = User.new(“John”)
p user.name
=> NoMethodError (undefined method `name’ for #)
“`

上のコードを見ていただくと分かるのですが、インスタンス変数はクラス外部からは参照できないんです。

## attr_reader
そこで、クラス外からインスタンス変数を参照した

元記事を表示

ActiveStorageでアップロードしたファイルの名前と拡張子を取得したい

## 前提
– `ActiveStorage`を利用しファイルをアップロード後

※ `Active Storage`使用していなくてもOK

## やること
– アップロードしたファイルの拡張子を表示
– アップロードしたファイル名を表示

## 拡張子の取得
※(今回は`User`モデルに`has_one_attached :avatar`を記載した例です)
### 手順
“`.rb
# アップロードしたファイルのurlを取得
avatar_url = rails_blob_path(@user.avatar)
# => “/rails/active_storage/blobs/xxxxxxxxxxxxxxx/ファイル名.jpg”

# ファイルの拡張子を呼び出す
File.extname(avatar_url).downcase
# => .jpg
“`

## ファイル名の表示

“`.rb
# アップロードしたファイルのurlを取得
avatar_url = rails_blob_path(@user.avatar)
# => “/rails/active

元記事を表示

Stripe CLIを使ってStripe決済をローカル環境で反映させる

Webエンジニア3ヶ月目のひよっこエンジニアです
Qiita初投稿となります

Stripe決済をローカル環境で反映させる方法を先輩エンジニアに聞きながら出来るようになったので自分なりに流れをまとめてみました
いつもやり方忘れてハマるので備忘録兼同じようなレベル感の人のために記録として残しておきます

「間違ってるよ!」とかございましたら是非コメントくださいませ!

## 前提
既にStripeの設定を終えていてアプリケーションとして使用できる状態
※ Stripeの設定方法については今回説明しません

## ローカル環境ではStripe決済が反映されない?

ローカル環境でStripe決済をしてもそのままではStripe側が決済を認識出来ないため決済がローカル環境に反映されません

> 1.購入処理動作(これはちゃんと動く)
>  ↓
> 2.Stripe側が決済を認識出来ないので購入したという証明(invoice)が作られない
>  ↓
> 3.証明がないのでローカル環境上では決済した情報が反映されない
>  e.g.) 購入完了後の画面に遷移したのに実際に購入されている状態に

元記事を表示

Model.model_name.humanなどについて

## いつ使うのか
Model.model_name.humanはいつ使われるのかというとI18nと呼ばれる国際化をする際に使われます。
実際にこのように書かれています。
config/locals/ja.yml
“`
ja:
activerecord:
errors:
models:
user:
attributes:
name:
blank: “が空になっています。入力してください。”
email:
blank: “が空になっています。入力してください。”
models:
user: “会員”
attributes:
user:
name: “名前”
email: “Eメール”
“`
このようにすることで、エラーメッセージ等の文言を日本語化することができるんです。
models階層の文字列を取得するには、
“`
User.model_name

元記事を表示

【Rails】has_manyにデフォルトでorderを設定する

## 実装方法

UserモデルにPostモデルが紐づくとします。
並び替えは作成日時の降順(新しい順)です。

“`ruby
class User
has_many :posts, -> { order(created_at: :desc) }, dependent: :destroy
end
“`

注意いただきたいのは、`dependent: :destroy`はorderの後ろに書くということです。

元記事を表示

HerokuでMySQLを使うならJawsDBにしよう

# 先に結論

herokuのアドオンにClearDBはもう使わない。JawsDBにしましょう。

# 本文

## herokuとは

仮想コンテナ型のホスティングサービスで、PaaS(Platform as a Service)にあたります。

heroku内に用意されているgitリポジトリにpush、またはgithubから特定のリポジトリ、ブランチをpullすることでコンテナをビルドします。Ruby, Java, Python, PHPなどのプログラミング言語、またそれらを利用している数々のフレームワークのビルドに対応しています。

## herokuの利点

herokuはポートフォリオのデプロイ先として大変人気があります。同じようなサービスにMicrosoft Azure や AWS などもございますが、 **最低ラインで使い続ける限りは無料で、勝手に有料になることがない**という部分がポートフォリオ用に選ばれやすい大きな理由だと思います。

他の、例えばAWSなどの競合サービスでは、仮想マシンの利用状況に応じて従量課金されます。毎月無料枠があるので慎ましく使えば実質無料です

元記事を表示

[個人開発] 数学好きのためのWebアプリを作ってみた (Rails + Typescript)

#まずはじめに
私は数学好きな高校3年生です。プログラミングは1年ほど前から独学で始めました。
今回、個人開発で数学好きのための **「$Mualphatheta$」**というWEBアプリを作ってみたのでこの記事でアプリの紹介をしようと思います。

アプリのURL$\; \to\;$ [https://mualphatheta.herokuapp.com](https://mualphatheta.herokuapp.com)
###なぜつくったのか
TwitterやInstagramなどで数学アカウントなるものがたくさんあり、みなさん文章や画像などで面白いと思った問題、自作問題、解いて欲しい問題を投稿しています。
今のシステムでは2点ほど**もったいない**と感じてしまうことがあります。

+ **媒体がTwitterやInstagramなどで分散してしまう**
+ **他の媒体ではTexに対応していないため $\raise 5px{x^2}$ などがx^2などで表現され、長い式だとわかりずらい**

これらの問題を解決するためにアプリを作りました。

#どんなアプリか
まずはス

元記事を表示

Rails6系+Vue3系で”Hello, Vue3!”

###はじめに
当方初記事となりますが、今回は私が一週間くらいハマりにハマってしまったRail6でのVueの導入、そしてブラウザに”Hello,Vue3!”を表示するところまでの手順を記したいと思います。

Rails6+Vue3に関する記事はQiitaをはじめとする各Q&Aサイトで多くの方が取り扱っていらっしゃいますが、私はどうにも要領が悪いのか、うまくいきませんでした。なぜかって?こっちが聞きたいです。

Vue.jsを初めて触るという方は、先にVue.js公式にてVue.jsについて確認しておくことを推奨致します。
https://v3.ja.vuejs.org/

##本記事のゴール
表題の通り、ブラウザ上で”Hello, Vue3!”です。
![スクリーンショット 2022-02-16 21.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494809/913305ad-7b41-f899-441a-7a8381307435.png)
ね、簡単そうでしょ?

##環境(コマンド:バ

元記事を表示

ActiveModelでパラメータのバリデーションをする

# はじめに
APIだけ開発して、期待していないJSONでリクエストしたら想定外の挙動になったので、その挙動を紹介します。

## 期待しない型で送ると500エラーになる
次のパラメータを期待したAPIを考えます。

* name
* 文字列型
* 必須
* 1文字以上、10文字以下
* mail
* 文字列型
* 必須
* メールアドレスの正規表現
* age
* 数値型
* 必須
* 0以上の整数

こんな感じのフォームを作ってバリデーションするかと思います。

“`email_validator.rb
class EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i.match?(value) record.errors.add(attribute, 'mus

元記事を表示

RailsアプリにBasic認証を実装する

## Basic認証とは

HTTP通信に元々備えられているユーザー認証の仕組み。
あるアプリケーションに利用可能なユーザー名とパスワードをあらかじめ設定しておき、ユーザーが利用しようとした際設定していたユーザー名とパスワードを入力させてログインできるようにする機能。要するに個別のパスワード設定ではなく全員に共通したパスワードでログインさせるようなこと。Railsで作成したアプリにBasic認証を導入するのは比較的簡単にできるようなので試してみたいと思います。

## Basic認証を実装するメソッド

Railsにはbasic認証を実装する’authenticate_or_request_with_http_basic’というメソッドが用意されているので、それを使ってbasic認証を実装してみたいと思います。

ベーシック認証が成功したらトップページに

![スクリーンショット 2022-02-16 10.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623433/43f6b856-fb

元記事を表示

rubyにおける::(ダブルコロン、コロンコロン)スコープ演算子

rubyではスコープ演算子というのがあります。::っていうやつです。
これを使うと、クラスやモジュールで定義されている定数を外部から参照することができます

“`
module Test
HOGE=20
FUGA=30
end

class Hogehoge
hoge = Test::HOGE
p hoge
end
=> 20
“`
こうすることによってmoduleで定義されている定数を参照することができるんです。

今回はメモ書き程度に終わらせようとおもいます
以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

元記事を表示

ログインができません<初心者>

ログインが出来ないだって?

Railsでアプリを作成中。
deviseを使用してユーザー管理機能を実装していました。
サインアップ、ログアウト、編集機能まで順調に進めていたところ、最後に確認としてもう一度正常に動くか確認したところ、、、

ロ、ログインができない・・・

ここまできてなんてこった。
どこが原因なのか・・・

「Devise::SessionController#new」を経由しているし
サーバーは反応しててパラメーターにもちゃんとメールアドレスとパスワードが入っている。
SequelProを見ながら間違いなく入力しているのに何度やってもログインに失敗し、

“`
Invalid Email or password.
(メールアドレスまたはパスワードが無効です。)
“`
↑ これの嵐。

初心者の自分にはパニックで一時フリーズ。
いったん冷静になって、また考えました。

MVCの流れに沿って進んでいる。
メールアドレスかパスワードが無効ということは、

「空」なのか「間違っている」かのどちらか。

でもどちらも間違っ

元記事を表示

dbのインデックス備忘録

インデックスについて学んだので、備忘録です。

## インデックスとは
**索引。dbの検索性能を上げる**

なぜ検索性能が上がるのかというと、インデックスをつけたカラムでは、レコードが作成される際にソートが行われ、検索したい文字列や数字を全レコード確認することなく、発見することができるから。

### メリットとデメリット
#### メリット
– レコードの検索やソートの速度が上がる

#### デメリット
– レコード作成時にソートしないといけない関係で、書き込みの時間が増える

### 例
ブログなどの何かしらの記事を投稿するpostsテーブルについて考える。レコードは以下の感じ。

*postsテーブル*

| id | body | created_at |
| :— | :— | —: |
| 1 | 本文です。 | 2022-01-01 12:00:00 |
| 2 | 本文です。 | 2022-01-01 12:01:00 |
| 3 | 本文です。 | 2022-01-01 12:02:00 |
| 4 | 本文です。 | 2022-01-01 12:

元記事を表示

rails 自動整形ツールRubocopの導入

# はじめに
rubyの自動整形ツールであるrubocopの導入方法をまとめる。

# 環境
– rails 6.0.4.4
– ruby 2.6.5
– rubocop 1.25.1

# Rubocopとは
Rubyのコード解析ツール。
自身で決めた規定通りにコードを書けているか解析、かつ、自動で修正してくれるツール。
インデントを揃えたり、余分な改行・スペースを削除したりできる。
[RubyStyleGuide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md)に基づいて指摘を行う。

公式 https://rubocop.org/

# Rubocopの導入方法
Gemファイルに記載

“`Gemfile.
groupdevelopment do
gem ‘rubocop’, require: false
end
“`

インストール

“`ターミナル.
bundle install
“`

Rubocopの設定ファイルを新規作成

“`ターミナル.
to

元記事を表示

Rails チュートリアルのrails serverでエラーが出た

前提

railsチュートリアルの「1.3.2 rails server」でサイトを表示したい。

開発環境 -> Cloud9
rubyおよびrailsバージョンは以下の通り。

“`terminal
ruby -v -> ‘6.0.3’
rails -v -> ‘5.1.0’
“`

チュートリアルの1.3.1までの環境構築は終わった状態で以下を実行。

“`terminal
Cloud9User:~/environment/hello_app (master) $ rails server

#省略

Use Ctrl-C to stop

“`

ここでpreviewすると以下のメッセージ

![ecc24368fac55bcbb0887b02bedc8076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/c3d3aef3-741d-23f1-8a01-7de51cb31f91.png)

エラーメッセージ↓
config.hosts << "de3360

元記事を表示

【Next.js + Rails + CarrierWave + S3】 Next.jsのnext/imageで画像を表示させる方法

# 初めに
 この記事ではNext.js が提供している[Image コンポーネント](https://nextjs.org/docs/api-reference/next/image) (next/image)についてのお話です。
 __imgタグのこと__ではないので注意してください。

# 内部の画像を表示
 内部ではルートディレクトリ配下にあるpublicを基準にして表示させることができます。
 とても簡単ですね
 【例】
 /public/images/test.png

“` JSX:test.js
sample
“`

# 外部の画像を表示
 公式にも書いてある通り
 ルートディレクトリ直下にnext.config.jsを作り
 【例】
 example.comの場合 

“` JSX:next.config.js
module.exports = {
images: {
domains: [“example.com”]

元記事を表示

after_createコールバック内の関連テーブル作成処理が2回実行される問題

# 結論

* after_createコールバック内で関連テーブルを作成する場合注意が必要。
書き方によっては関連テーブルが2つ作成されてしまう。

# 環境
Ruby 3.0.2p107
Rails 6.1.4.6

# やりたかった事
* 生徒が講義の登録を行う多対多構造の作成
* 生徒の登録と同時に必修科目”math”の登録

model/course.rb

“`rb
class Course < ApplicationRecord has_many :course_students has_many :students ,through: :course_students end ``` model/student.rb ```rb class Student < ApplicationRecord after_create :regist_essensial_course has_many :course_students has_many :courses, through: :course_students private

元記事を表示

herokuにpushできなくてお困りのあなた。こちらをご覧ください。

昨日はできていたpush…

“`
$ git push heroku
Username for ‘https://git.heroku.com/~’:
Password for ‘https://git.heroku.com/~’:
remote: ! WARNING:
remote: ! Do not authenticate with username and password using git.
remote: ! Run `heroku login` to update your credentials, then retry the git command.
remote: ! See documentation for details: https://devcenter.heroku.com/articles/git#http-git-authentication
fatal: Authentication failed for ‘https://git.heroku.com/~’
“`
なんか言ってんな

元記事を表示

haml導入から基本的な使い方

## gemを使いhamlを導入する

“`ruby
gem ‘haml-rails’
gem ‘erb2haml’ # 現在erbでファイルを作成していてhamlに書き換えたい場合はこちらをインストール
“`

bundle install

## ※erb2hamlを使いerbファイルをhamlに書き換える場合

“`ruby
rails haml:convert_erbs # erbファイルを残して新しく作り直す場合はこちらのコマンド
rails haml:replace_erbs # erb自体をhamlファイルに変更したい場合はこちらのコマンド
“`

rails haml:convert_erbsを実行してみる。

画像上: 変更前(.erb)

画像下: 変更後(.haml)
![スクリーンショット 2022-02-15 9.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623433/27b06a3e-8b2b-c8dc-e3fc-81368afbcd12.png)

元記事を表示

OTHERカテゴリの最新記事