Ruby関連のことを調べてみた2020年09月28日

Ruby関連のことを調べてみた2020年09月28日
目次

【Rails6】GraphQLを使用したAPI開発(Query編)

## はじめに
rails6でGraphQLを用いた開発を行ったので、導入方法や使い方をまとめてみました。
今回はQuery/アソシエーション/N+1問題を取り上げて、ご紹介します。

## 開発環境
ruby2.7.1
rails6.0.3
GraphQL

## 1. GraphQLって何?
GraphQLとはAPIリクエストのためクエリ言語で下記の特徴があります。

– エンドポイントは`/graphql`1つのみ
– Query: データの取得(Get)
– Mutation: データの作成、更新、削除(Create, Update, Delete)

RESTとの大きな違い一つ目のエンドポイントが一つということです。
RESTの場合、`/sign_up`, `/users`, `/users/1`など複数のエンドポイントが存在しますが、
GraphQLの場合は、エンドポイントは`/graphql`のみです。

RESTでは複数のリソースで必要な場合、複数のAPIリクエストが必要ですが、
GraphQLはエンドポイントが一つなので、必要なデー

プログラムにおける処理の順番 

学習期間が現在11週目に突入。今まで学んだ事の振り返りと、よく間違えている事について紹介します。

今回は「処理の順番」です。基本中の基本で初歩的な内容ですが、記述の順番を間違えておりエラーが発生していたというケースも多々あるので、学習し始めたばかりの方の参考になれば幸いです。
また現在学習している言語は「Ruby」ですので、内容も「Ruby」のものとなります。

使用しているrubyのバージョンは以下の通り。

“`
ruby 2.6.5
“`

###処理の順番について
まずソース内でのプログラム処理の順番は、基本的に**「上から下へ1行ずつ順番に」**です。
これは複雑な記述やRuby on Railsを使ってアプリを作成した際でも変わりません。(※メソッドの呼び出しや条件分岐、繰り返し処理を行う際は下から上へ戻ったり行が飛んだりしますが、基本的な処理の順番を意識しておくと理解しやすいと思います。)
簡単なプログラムで表現すると、

“`ruby
puts “1行目”
puts “2行目”
puts “3行目”
“`
と記述した場合、コンソールで実行すると

“`rub

最後に任意の文字があるかのメソッドを作る

【概要】
—————————————-
1.結論

2.どのようにコーディングするか

3.開発環境

1.結論
—————————————-
downcaseメソッド、lengthメソッドと、sliceメソッド3種類を使う!

2.どのようにコーディングするか
—————————————-

“`ruby
def str_discrimination(str_a, str_b)
a_down_str = str_a.downcase #—❶
b_down_str = str_b.downcase
a_len_str = a_down_str.length #—❷
b_len_str = b_down_str.length
if b_down_str.slice(-(a_len_str)..- 1) == a_dow

CodeWarでの勉強(ruby)④ case~when

#この記事について
最近始めたCodewarを通じて学べたことを少しずつアウトプット

##問題
>You probably know the “like” system from Facebook and other pages. People can “like” blog posts, pictures or other items. We want to create the text that should be displayed next to such an item.
Implement a function likes :: [String] -> String, which must take in input array, containing the names of people who like an item. It must return the display text as shown in the examples:

引数で配列を受け取るlikesメソッドを実装して、配列に含まれる情報から誰がイイねをしたか表示させるようにさせる。

[Rails]データベースに保存された情報をviewに表示する方法

## 投稿の内容
今回はデータベースに保存された情報をviewに表示する方法について投稿します。
なお、既にデータベースに情報は保存されている、として投稿します。

実装の流れは以下の通り。

① コントローラーアクションの記述(showアクション)
② 表示したい情報が文字列の場合
③ 表示したい情報が複数枚画像の場合

## 環境
Rails 5.2.4.3
ruby 2.5.1
mysql 14.14
viewはhamlで実装

## ① コントローラーアクションの記述(showアクション)
今回は`商品(item)詳細ページ`に情報を表示したいので、`itemsコントローラーのshowアクション`を使います。

“`items.controller.rb
class ItemsController < ApplicationController #省略 def show @item = Item.find(params[:id]) end #省略 ``` 解説) まず`Itemモデルのpathのidをfindメソッドで検索し、該当するidに属した商品(

Rails6 OmniAuth activestorage ユーザー画像を取得する

永遠の初心者による自分のためのメモ。
Rails学習開始3ヶ月。
とりあえずこれで動きました程度に考えていただければ幸いです。
こうした方がええやんと言うご意見がある方は優しいコメント頂けると嬉しいです。

この記事の目的

active storageにユーザーのプロフィール画像を保存する。
ググってみてもcarrierwaveばかりでactive storageの記事をあまり見かけなかったので、同じ境遇の人がいればと思い投稿ました。

環境

Ruby 2.7.1p83
Rails 6.0.3.3

前提条件

deviseによるログイン機能実装済み。

OmniAuthによるTwitter、google、facebookなどのログイン認証機能実装済み。

私は、以下の記事を参考にさせて頂きました

・手続き関連
https://qiita.com/kazuooooo/items/47e7d426cbb33355590e
・OmniAuth導入
https://qiita.com/LuckHack

Rails6 OmniAuth twitter認証 emailの条件分岐

永遠の初心者による自分のためのメモ。
Rails学習開始3ヶ月。
とりあえずこれで動きました程度に考えていただければ幸いです。
こうした方がええやんと言うご意見がある方は優しいコメント頂けると嬉しいです。

この記事の目的

twitter認証はメールアドレスを取得しないので、ランダムメールアドレスを生成する。
google、facebook認証は、正規のメールアドレスを取得する。
twitterはランダムアドレス。他は、正規のアドレスで条件分岐させる。

環境

Ruby 2.7.1p83
Rails 6.0.3.3

前提条件

deviseによるログイン機能実装済み。

OmniAuthによるTwitter、google、facebookなどのログイン認証機能実装済み。

私は、以下の記事を参考にさせて頂きました

・手続き関連
https://qiita.com/kazuooooo/items/47e7d426cbb33355590e
・OmniAuth導入
https://qiita.com

Rails: rake taskを良い感じに書く方法

# 良い感じ = 以下の二点

1. テストしやすいこと
* 工数削減のため
1. (ある程度は)エンジニア間での書き方が統一できること
* 例えば`dryrun`の指定方法が書き手によってまちまちだと、商用でのtask実行時に事故が起きる可能性もあるので統一可能であればした方が良い
* ログのフォーマットが統一されていないと作業効率が悪い

などなど

# コード

“`ruby:lib/tasks/issue_6885.rb
require_relative ‘helpers/all_user_name_update_helper.rb’

namespace :issue_6885 do

desc ‘これはサンプルです’
task all_user_name_update: :environment do
helper = AllUserNameUpdateHelper.new

helper.main
end
end
“`

“`ruby:lib/tasks/helpers/all_user_name_upd

【第1回】RSpecビギナーが、ビギナーなりにModelSpecを書いてみた

#はじめに
はじめまして。最初に自己紹介を簡単にさせて頂きます。
2020年5月〜2020年9月までDMMWEBCAMPにてRubyを中心に学習し、現在転職活動中の卒業生です。
先日、RSpecの雄である伊藤淳一 @jnchito さんのご厚意で開催された初学者向けの勉強会[(RSpecビギナーズ!!)](https://www.youtube.com/watch?v=4lgaIeKdrR4 “RSpecビギナーズ!!”)にも参加致しました。

ポートフォリオにRSpecを用いたテストを記述する中で感じた、
私と同じ初学者なら「ここでつまづくだろうな:thinking:」とか「ここが分からん:hugging:」といった”つまづきポイント”を稚拙ながら初学者目線でまとめました。
また、やっていく中で自分が書きたい機能の具体的なテストコード例が欲しいと思うことがあったので、自分の復習も兼ねてますが、この記事がRSpecビギナーズにとって少しでも参考になれば嬉しいなと思います。
※厚かましくはありますが、この記事をたまたま見た”RSpecエキスパート”がいらっしゃいましたら、下手くそなコー

CodeWarでの勉強(ruby)③ squeeze, gsub

##この記事について
最近始めたCodewarを通じて学べたことを少しずつアウトプット

##問題
>Implement the function unique_in_order which takes as argument a sequence and returns a list of items without any elements with the same value next to each other and preserving the original order of elements.

関数unique_in_orderを使って引数としてシーケンス?を受け取り、同じ値が隣接してなくて、要素の順番にしてリストを返すようにさせる。

“`ruby
unique_in_order(‘AAAABBBCCDAABBB’) == [‘A’, ‘B’, ‘C’, ‘D’, ‘A’, ‘B’]
unique_in_order(‘ABBCcAD’) == [‘A’, ‘B’, ‘C’, ‘c’, ‘A’, ‘D’]
unique_in_order([1

f.collection_selectの”選択して下さい”を選んだときのバリデーション

#1.やりたいこと
`<%= f.collection_select :address_id, @customer.addresses, :id, :full_address, :include_blank => “選択してください” %>`
フォームにおいて選択せずに一番上の”選択して下さい”を選んだ際にバリデーションをかけたい。
#2.実装する
“`rails:app/controllers/orders_controller.rb
params[:order][:address_id] == “”
flash[:notice] = “選択して下さい”
redirect_to new_order_path
“`
パラメータから送られている値を見ると`””`となっていたのでイコール文を`””`に変更。
#3.終わりに
これを実装したかった時にQiitaやGoogleで検索しても全然出てこなかったので
投稿しました。
しっかりターミナルを見て返ってきてる値を確認しないといけないと痛感しました。

バイナリーサーチを使って配列の中に任意の値があるか確認する

既にいろんな方が書いている話ではありますが、
書くことによって自分の中で理解を深められたら、と思ったので書きます。

## 問題
下記の問題をバイナリーサーチを使って解いてみます。

配列 `array=[1, 3, 5, 6, 9, 10, 13, 20, 26, 34]`があり、
この配列に任意の値が存在するかどうかを検索するコードを作成する。
任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示し、
存在する場合は、配列の何番目にあるかを表示する。

“`
# 出力例1
検索したい数字を入力してください
5
5は配列の2番目に存在します

# 出力例2
検索したい数字を入力してください
8
8は配列内に存在しません
“`

## そもそもバイナリーサーチとは何か
ソート済みのリストや、配列に入ったデータ(同一の値はないものとする)に対する検索を行うとき、
中央の値を見て、検索したい値との大小関係を用いて、
検索したい値が中央の値の右にあるか、左にあるかを判断して、
片側には存在しないことを確かめながら検索していく方法のこと。
1回の処理で選択肢が半分になるの

Basic認証を交えたテストコードの書き方

【概要】
—————————————-
1.結論

2.○○になるのはどういう時か

補足:開発環境

1.結論
—————————————-
環境変数を変数に埋め込み、visitでその環境変数を埋め込んだURLに飛ぶようにする!

2.どのように記載するのか
—————————————-

“`ruby
def basic_pass(path) #—❶
username = ENV[“STUDY”]
password = ENV[“STUDY_password”]
visit “http://#{username}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}#{path}”
end

RSpec.des

[rails] NOFILEのマイグレーションファイルを削除

###事件内容

このようなファイルができてしまい、
rollbackができないため、マイグレーションファイルをdownさせることができない

“`
up 20200926110535 ********** NO FILE **********

“`

###事件が起こった経緯

おそらくマイグレーションのステータスがUPの状態で
マイグレーションファイルを削除してしまった。

私の場合はgitデスクトップでchangeを丸ごと削除したので、この事件が起きた模様。

###解決策

えっと、皆様が載せてくださっていた記事を何個か見させていただいた結果、無事解決いたしました。

まず、no faileに名前を付与するために
ターミナルでこのコマンドを実行してください:zap:
(マイグレーションIDはあなた様のnofileになっているIDに変えてください。
  その後の名前はダミーですのでなんでも構いません。)

“`
% touch db/migrate/20200926110535_fuwafuwa.rb
“`

実行後↓

“`2020092

しがないRailsエンジニア2年生が2年間の振り返り

初めまして。
あと1ヶ月ほどでエンジニアになって2年経ちます。
振り返りついでにその時感じた課題の変遷をまとめようと思いました。
(一旦Railsに関することだけ抜き出しています)

なんとか生き残ってるエンジニアの課題を共有できれば幸いです。


### エンジニア歴
– 1ヶ月目
– Railsは半年ほど独学でやってきたものの全体的にあまり理解できていなかった
– Rails以外にもエンジニアの仕事の仕方やITの概念が必要で覚えることが多かった
– 3ヶ月目
– 何となくRailsが使えてるだけで天狗になっていた時期
– 動けば良いや精神
– 6ヶ月目
– 動くものは作れるようになったけどこの時は適当に書いて動くからヨシとしていた
– 1年目
– Railsのコードを俯瞰して追えるようになり全くわからなくなった
– 過去の自分が恥ずかしくなった
– Rails以外にReactやサーバ知識など、覚えることが多くRailsは後回しにしていた
– 1年2ヶ月目
– Railsそっちのけでインフラ周りに注力していた
– Railsはまだ動け

[Ruby on Rails]データ登録時に重複したレコードがあった場合、登録させない

#背景
オリジナルアプリをデプロイ後、重複したデータを登録されていることに気づきます。
![スクリーンショット 0002-09-27 午前9.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628696/9f411b90-a3c7-8998-6ea7-8dce789a820f.png)

アプリの仕様としては、登録するレコードは重複させたくないのです。

データベースを確認すると、
登録するユーザが異なっていれば、登録できてしまうことが判明。
![スクリーンショット 0002-09-27 午前9.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628696/445d4d8a-b9a8-3095-0bea-e7170ebb30de.png)

解決にそこそこ時間がかかったので、備忘として記録します。
#問題箇所
controllerにデータ登録時の条件を設けていました。

“`
require ‘ru

関連付しているモデルのレコードが消せずハマった

# 作業環境
Rails ‘5.2.3’
Ruby ‘2.7.1’
PostgreSQL

# 何にハマったか
レビュー共有アプリ作成中にローカル環境で動作確認中、登録されているitemを削除しようとしましが

`ActiveRecord::InvalidForeignKey in ItemsController#destroy`
`PG::ForeignKeyViolation: ERROR: update or delete on table “reviews” violates foreign key constraint “fk_rails_5350d1b47c” on table “comments” DETAIL: Key (id)=(6) is still referenced from table “comments”. : DELETE FROM “reviews” WHERE “reviews”.”id” = $1`

というエラー、、。`on table “comments”`ってコメントテーブルなんてないぞ。と頭を悩ませていましたが、アプリ作成当初にrevie

【地図表示】Google Maps JavaScript APIとGeocoding APIを用いてユーザーが登録した住所から地図を表示する!

# 概要
Google Maps JavaScript APIとGeocoding APIを用いてユーザーが登録した住所から投稿詳細ページに地図を表示した時のことを備忘録として記録します。

# 環境
・ruby ‘2.5.7’
・rails ‘5.2.3’

# 前提
・Google MapsのAPIキーを取得済であること
・投稿モデル(ここではDatespotモデル)に住所(adress)カラムがあること

【参考】
[Google MapsのAPIキーを取得する](https://nendeb.com/276)

# 過程
## 1.投稿詳細ページの作成
投稿詳細ページは、各自の仕様に合わせて作成してください。

“`views/show.html.erb

  (省略)

<%= @datespot.name %>

二つのテーブルを繋ぐ存在、中間テーブル

#中間テーブルとは
 二つのアソシエーションしたいテーブル同士が「多対多」の関係のときに、テーブルの間を受け持つ、便利なやつ。

##具体例
 LINEを思い浮かべると、一人のユーザーはいくつものグループに所属している。また、一つのグループには、何人ものユーザーが招待されている。このとき、ユーザーとグループは「多対多」の関係と言える。
##問題点
 「多対多」のテーブルをそのままアソシエーションすることが困難である。
##解決策
 先の例で言えば、ユーザーとグループの間に組み合わせを記録するテーブルをかませる。それが、中間テーブル。ユーザーとグループの組み合わせを記録するというのがポイントで、カラムにはユーザーidとグループidが必要となる。
##記述
 アソシエーションをするため、「has_manyメソッド」「belongs_toメソッド」を使う。
 そのモデル(テーブル)ファイルの目線になって、繋がりを持ちたいモデル(テーブル)にはが複数か単数か考える。
ex) user(モデル) has_many groups
ここは、もはや英語の話。

“`Ruby:group.rb
ha

Ruby on RailsにてRails new〜デプロイまでの忘備録2

#Ruby on RailsにてRails new〜デプロイまでの忘備録2です!

、Rails newコマンドでアプリケーション作成からデプロイまでの一連をつらつらと書いていきます。

前回
https://qiita.com/gonshiba-n/items/abd1b11e35f99eb5975f

##Railsアプリケーションの日本語化と日本時間適応

“`config/application.rb
require_relative ‘boot’

require ‘rails/all’

# Require the gems listed in Gemfile, including any gems
# you’ve limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module xxxxxx
class Application < Rails::Application # Initialize configuration defaults for o