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

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

Railsでincludes(eager_load)した値を、where句を使用せずに絞り込む

調べたけど意外に出てこなかったので書いてみます。
ActiveRecord の join, includes, preload, eager_load の違いについては、この記事では言及しません。

## ユースケース

N + 1 問題回避のために includes を使用したいけれど、絞り込みには where 句を使いたくない。
例えば includes で取得した値に対して、同じ処理内で異なった条件での絞り込みをしたいとき。

## 結論
[ActiveRecord::QueryMethods#where](https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where) じゃなくて、 [Array#select](https://docs.ruby-lang.org/ja/latest/method/Array/i/filter.html) を使用して絞り込む。

## サンプルコード
https://github.com/t0yohei/rails-ar-filter-with

元記事を表示

CPaaSってなに?VonageとTwilioの具体例で理解するコミュニケーションAPIことはじめ

[最新CPaaSコミュニケーションAPIを比べる or 使ってみよう! 【PR】Vonage Japan](https://qiita.com/advent-calendar/2021/vonage2021)の9日目を担当する仁科(@nishina555)と申します。

多種多様なデバイスの登場によりCPaaSの注目度はより一層高まっています。
しかし、**ひとことでCPaaSといってもその領域は多岐に渡るため、初学者にとっては難しく感じる分野かもしれません。**
特に開発者の場合はCPaaSの概要だけでなく、CPaaSから提供されるコミュニケーションAPIの利用方法も理解する必要があります。

そこで今回は**CPaaS・コミュニケーションAPIの概要と、VonageとTwilioを例にした具体的なコミュニケーションAPIの利用方法について紹介**します。
あわせて、**Vonage APIを利用した開発のTipsについても紹介**し

元記事を表示

【Rails】form_withのHTTPメソッドの判断基準について【POSTかPATCHか】

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

## 今回の疑問点
 今回の疑問点は、

  _`form_with`はどのようにして`POST`と`PATCH`を判断しているのか_
 
 です。 

 非同期通信によるコメント機能を実装していた際に疑問を抱きました。
 納得のいく結論に至るまでかなり時間を要したのでまとめておきます。

## 疑問点についての解説

###結論
 モデルのインスタンスに対する`persisted?`の戻り値がtrueをなら`PATCH`、そうでなければ`POST`。つまり、データベースにインスタンスが保存されているかで判断している。

###`persisted?`とは
`persisted?`メソッドは、インスタンスがデータベースに保存済みかどうかをチェックするメソッドです。インスタンスがデータ

元記事を表示

【Rails】deviseの導入手順

# はじめに
Railsでログイン等の認証機能を`devise`で実装する機会があったので手順をまとめておく。

# deviseとは
以下のような**認証機能**を簡単に実装することができるgem

* ユーザー登録
* ログイン
* ログアウト
* 登録情報の編集
* パスワード変更、再発行

# 導入手順
## 1. Gemfileに以下を追記する

“`ruby:Gemfile
gem ‘devise’
“`

## 2. deviseの設定ファイルを作成する

“`shell
$ rails g devise:install
“`

コマンドを実行することで以下二つの設定ファイルが作成されます。

* config/initializers/devise.rb
* config/locales/devise.en.yml

## 3. モデルを作成する
* 認証機能を付与したいモデルを作成する
* `generation`の後は`model`ではなく`devise`とすることに注意する

“`shell
$ rails g devise User
“`

* 以下

元記事を表示

Rails6とFirebase Authでパスワード変更を実装する方法

Rails6とFirebase Authでパスワード変更機能を実装する方法の解説です。流れとしては
1. 現在のパスワードと新しいパスワードを入力させる。
2. 現在のパスワードが合っているか確認
3. 新しいパスワードに変更
という感じで実装しています。

# view
for_withで現在のパスワードと新しいパスワードを入力できるようにします。

“`erb:views/passwords/edit.html.erb
<%= form_with url: "パス", method: "GET", id: "password-form", local: true do |form| %>
<%= form.label "現在のパスワード" %>
<%= form.text_field :current_password, type:"password"%>
<%= form.label "新しいパスワード" %>
<%= form.text_field :new_password, type:"pass

元記事を表示

Enumのまとめ

## Enumとは

日本語では列挙型とも呼ばれている。

Railsで使うEnumは、モデルに定義することができるカラムで、
データベースの特定のカラムの値を、指定した文字列で扱うことができるもの。

**1つのカラムに複数の変数に連続した値を付けられる便利な機能らしい。**

> (使い方の例)記事の下書きの機能を実装したい。
→ 記事作成に新しくstatusカラムを作り、Enumを使ってそのカラムの中に下書きの記事と公開記事を入れることで、データベースに両方のデータを保存することができる!
>

## Enum を定義してみる

まず、Enum を使うには、実装したいモデルの中に定義する必要がある

例えば下記のような定義をする!

“`ruby
class Article < ActiveRecord::Base enum status: [ :test, :production, :development] end ``` status カラムに、test と production と development を定義している。 そして実際にモデルの中に statu

元記事を表示

【Ruby】each_with_objectとinjectの違い

##each_with_object
配列やハッシュの要素を使って、新たに配列やハッシュを作成したりする際に簡潔に書くことができる。

– 引数に渡されたオブジェクトが常にhash変数に入っている。

“`ruby
array = [[:hoge, 1], [:fuga, 2], [:piyo, 3]]

array.each_with_object({}) do | (key, value), hash |
hash[key] = value
end

# => {:hoge=>1, :fuga=>2, :piyo=>3}
“`

##inject

– ブロック内で最後に評価された値が入るのでブロック内でもう一度“`hash“`を書かないといけない。

“`ruby
array = [[:hoge, 1], [:fuga, 2], [:piyo, 3]]

hash = array.inject({}) do | hash, (key, value) |
hash[key] = value
hash
end

#=> {:hoge=>1, :fuga=>2,

元記事を表示

Postgres接続エラー「PG::ConnectionBad connection to server on socket “/tmp/.s.PGSQL.5432″」を改善

# 状況

アプリケーション開発中にserver起動をしたところ下記のエラーが発生。
直前までserver起動やコマンドエラーはありませんでした。

“`irb:エラー内容
PG::ConnectionBad: connection to server on socket “/tmp/.s.PGSQL.5432” failed: No such file or directory
Is the server running locally and accepting connections on that socket?
“`

# 環境

– macOS Big Sur 11.6.1
– PostgreSQL 14.0
– Rails 6.0.3

# 対処

“`irb:postgresqlの停止と再起動を試みる
$ brew services stop postgresql
$ brew services start postgresql
$ brew services restart postgresql
“`
エラー内容から上記を試すも改善せず。
[こちらの記事

元記事を表示

【Ruby】with_object

##with_object
繰り返しの各要素にオブジェクトを添えてブロックを繰り返し、オブジェクトを返り値として返す。

“`ruby
# 0,1,2 と呼びだす enumeratorを作る
to_three = Enumerator.new do |y|
3.times do |x|
y << x end end to_three_with_string = to_three.with_object("foo") to_three_with_string.each do |x,string| puts "#{string}: #{x}" end # => foo:0
# => foo:1
# => foo:2
“`

##参考

https://docs.ruby-lang.org/ja/latest/method/Enumerator/i/with_object.html

元記事を表示

【Ruby】配列の要素の平均値をちょっと簡単に出す

Rubyには“`average“`メソッドがないため、
配列の要素の平均を出すときは今まではこうしていた。
独学の頃はいちいち“`to_f“`するの面倒だなと思ってたけどこういうものだと思ってた。

(RailsのActive Recordには“`average“`メソッドがある。)

“`ruby
array = [4, 5]
array.sum.to_f / array.size.to_f
#=> 4.5
“`

ちなみにまとめて“`to_f“`すると正しい値が返らない。

“`ruby
array = [4, 5]
(array.sum / array.size).to_f
#=> 4.0
“`

##fdivメソッド
self を other で割った商を Float で返すので、ひとつひとつ“`to_f“`しなくていい。
今までの方法よりちょっとだけ楽に平均を出せることがわかった。

“`ruby
array = [4, 5]
array.sum.fdiv(array.size)
#=> 4.5
“`

##参考

https://docs.

元記事を表示

rails devise サインアウトのリダイレクト先設定時のエラー

### devise サインアウトのリダイレクト先設定時にエラーのが起きてしまう原因について

### 初めに
___
こんにちは。DMM WEBCAMP Advent Calendar 2021 8日目を担当します@Hbk__17です!
普段受講生さんに教えていた際に、よく受講生さんがつまづいていた箇所で「deviseを使用した際のログアウトの条件分岐でエラーが出てしまい直せません」といったような質問をよく頂いていたのですが、しっかり解説をしている記事を見かけなかったので、今回私の記事ではなぜこのようなエラーが出現するのかについてと、どのように直せばいいのかを解説していければと思っております!先に早くエラーを治したいという方は[こちら](#今回のエラーの解決方法)をご参照ください。

### エラーについて
***
今回主に解説を行うエラー文は、deviseを使用した際のログアウトを設定した際に起こるこのエラー↓について解説したいと思います!
![スクリーンショット 2021-11-29 13.35.13.png](https://qiita-image-store.s3.ap-no

元記事を表示

Goreplayを入れた話

エイチームフィナジーアドベントカレンダー8日目は私 @NMura3 が担当します。

## 概要
サービス運用していると、プログラム言語やフレームワーク、OSやライブラリーのバージョンアップがつきまといます。
その際に起きてほしくはないですが、障害が発生してサービス停止する場合があります。
どんなに入念にテストしたり、準備をしても一定数発生してしまうことはありませんか?

そんな時に便利に検証できるのがGoreplayになります。

## Goreplayとは
GoReplayはGoで開発されたOSSのネットワークモニタリングツールです。
https://goreplay.org/

流れてくるリクエストをキャプチャして、他のサーバーに同じリクエストを流すことができます。
つまり、テスト環境やステージング環境に本番にくるリクエストを流して、本番のリクエストでテストが可能になります。

また、リクエスト数も本番と同様になるので、負荷テストも可能です。

![go-replay.png](https://qiita-image-store.s3.ap-northeast-1.amazona

元記事を表示

【Rails】RSpec、Capybara、FactoryBotの使い方

##テスト用ライブラリ
・RSpec
 RubyにおけるBDD(振舞駆動開発)のためのテスティングフレームワーク。
 Rspecを利用する上で、「テスト」ではなく「spec」という用語を利用する。

・Capybara
 WebアプリケーションのE2E(End-to-End)のテスト用フレームワーク。Rail5.1からRailsに同梱済。
 MinitestやRSpecなどのテスティングライブラリと合わせて使う。

・FactoryBot
 テスト用データの作成をサポートするgem。
 テスト用のデータを簡単に用意し、テストから呼び出して利用することができる。
 一般にデータを作成することを簡単にする仕組みは「ファクトリ」と呼ばれている。

##事前準備
####Rspec
Gemfileにて以下の文を追加し、RSpecのRails用の機能が追加される。

“`
gem ‘rspec-rails’,’~>3.7′

$bundle install
“`

gemのインストールが終われば、以下のgenerateを実行。

“`
$ rails g rspec:install
“`

元記事を表示

【Ruby】map.with_index

##with_index
配列などの要素にindexを添えることができるメソッド

“`ruby
[100, 200, 300].map.with_index do |n, idx|
p [n, idx]
end

#=> [[100, 0], [200, 1], [300, 2]]
“`

– “`with_index(1)“`で指定の数字からカウントできる

“`ruby
[100, 200, 300].map.with_index(1) do |n, idx|
p [n, idx]
end

#=> [[100, 1], [200, 2], [300, 3]]
“`

##each_with_index

“`ruby
[100, 200, 300].each_with_index do |n, idx|
p [n, idx]
end
# => [100, 0]
# [200, 1]
# [300, 2]
“`

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/ea

元記事を表示

【Ruby】インクリメント++の代わりは+=

##インクリメント
変数の値を1増やす演算。

Rubyではインクリメント“`++“`がないので、代わりに“`+=“` “`succ“` “`next“`を使う。

“`ruby
sum = 0
sum += 1
puts sum

#=> 1
“`

“`ruby
sum = 0
sum = sum.succ
puts sum

#=> 1
“`

##デクリメント
変数の値を1減らす演算

Rubyではデインクリメント“`–“`がないので、代わりに“`-=“` “`pred“`を使う。

“`ruby
sum = 0
sum -= 1
puts sum

#=> -1
“`

“`ruby
sum = 0
sum = sum.pred
puts sum

#=> -1
“`

元記事を表示

草稿

更新一篇草稿

元記事を表示

【Rails】配列をキーでsortしたい

配列をpriceの昇順でsortしたいとき

“`ruby
array = [
{‘id’=> 1, ‘price’=> 300},
{‘id’=> 2, ‘price’=> 100}
]
“`

なんとなくキーを指定したらsortできたようなーと思ったけどできなかった。

“`ruby
array.sort(:price)
#=>ArgumentError (wrong number of arguments (given 1, expected 0))
“`

sort_byでブロックの中でキーを指定する。

“`ruby
array.sort_by { |a| a[‘price’] }
#=> [{“id”=>2, “price”=>100}, {“id”=>1, “price”=>300}]
“`

##参考

https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html

元記事を表示

【Ruby】nextとreturn

map関数などの繰り返しの処理の中で、
ある条件のときだけ次のループに行きそのまま処理を続けたいときはreturnじゃなくてnextを使う。

##next
nextはもっとも内側のループの次の繰り返しにジャンプします。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#next

“`n + 1“`が偶数のときに“`puts “hello! #{n + 1}回目”“`を実行せずに次のループにいく。

“`ruby
def next_method
5.times do |n|
next if (n + 1).even?
puts “hello! #{n + 1}回目”
end
puts “完了!”
end

next_method

#=>hello! 1回目
#=>hello! 3回目
#=>hello! 5回目
#=>完了!
“`

##return
式の値を戻り値としてメソッドの実行を終了します。

https://docs.ruby-lang.org/ja/lat

元記事を表示

RailsのAPIサーバーのレンダリングを速くしました

この記事は[Akatsuki Advent Calendar](https://adventar.org/calendars/6566) 7日目の記事です。
前回は jyllsarta さんの[ほぼ素のRailsアプリだった「スピカとチロル」が本番環境で安定動作するまで](https://jyllsarta.net/stray_release)でした。

# TL;DR
Jbuilderが遅いから、MVCを保ちつつjsonのレンダリングを速くできる仕組みを作った話です。
Gemを公開したので、よかったら使ってみてください!
https://rubygems.org/gems/simple_json
詳しくは github で見てね!
https://github.com/aktsk/simple_json

# なぜ作るか
RailsでAPIサーバーを書き始めて2年くらいの頃、負荷改善が好きで、毎日New Relic を眺め、APIの負荷改善をしていました。遅いAPIの改善をしていた際に、partialを展開することでレスポンス時間がかなり改善したことがありました。それで疑問を持ち始め

元記事を表示

Ruby rubocop 「Metrics/CyclomaticComplexity: Cyclomatic complexity for index is too high.」エラーへの対処

# 1.状況

ruby 2.6.3p62
rails 5.2.6

Gemfile にコーディングを精査するrubocopをインストールして実行したところ
以下のような警告が発生した

“`
app/controllers/public/posts_controller.rb:3:3: C: Metrics/CyclomaticComplexity: Cyclomatic complexity for index is too high. [11/7]
def index …
“`

該当箇所のコントローラーファイルは以下のようになっていた。

“`app/controllers/public/posts_controller.rb
class Public::PostsController < ApplicationController def index # デフォルトは更新日時の降順に並べる @posts = Post.all.order(updated_at: 'DESC').page(params[:page]).per(10) @r

元記事を表示

OTHERカテゴリの最新記事