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

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

しがない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 Tutorial 第14章 完了、全部で 155.5時間かかりました。

##2020/9/13 0.5時間
14.1.1完了です。

##2020/9/14 0.5時間
14.1.2.1途中です。

##2020/9/15 0.5時間
14.1.2完了です。

##2020/9/16 0.5時間
14.8途中です。

##2020/9/17 0.5時間
14.1.4完了です。

##2020/9/18 0.5時間
14.1.5完了です。

##2020/9/19 2.0時間
14.2.1完了し、演習 14.2.2.2の途中です。

##2020/9/20 2.0時間
14.2.2完了し、14.27の途中です。

##2020/9/21 2.0時間
14.2.3-4完了し、演習16.2.5.1の途中です。

##2020/9/22 2.0時間
14.2.5-14.3.1完了です。

##2020/9/24 0.5時間
14.44の途中です。
9/23は朝早く出社だったのでできませんでした。夜帰宅した後は疲れていてやる気がでないです。朝にやるのがよいと改めて感じました。

##2020/9/25 0.5時間
演習14.3.2.3の途中です。
INNER JOI

元記事を表示

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

# 作業環境
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 %>

VPSのRailsに独自ドメインを適用し、SSL(https)化する(CentOS 8.2 / Nginx)

*この記事は自分のブログに投稿していた内容からの転載です。日頃、Qiitaの記事には大変お世話になっているため、私のブログ記事の中でもよくアクセスされる(=つまり参考にされていると思われる)ページをQiitaに投稿してわずかばかりでも恩返しとなればと思っています。

なお、前回投稿した以下の記事から連続して作業している状態です。ただし、前回の記事と直接的な繋がりはないため、本記事の作業だけを独立して実施しても大丈夫です。

[「ConoHa VPS(CentOS 8.2)に Rails 6 + PostgreSQL + Nginx + Unicorn + Capistrano でデプロイする」](https://qiita.com/supunicjp/items/961c1e06d0ddc81728fa)

以下、早速スタートです。

CentOS(8.2)とNginxの環境を前提としています。作業開始時点は`http://IPアドレス`を入力するとRailsのアプリが表示されるようになっている状態が前提です。

また、お名前ドットコムですでに独自ドメインを取得している想定で

元記事を表示

【Mysql2】Mysql2::Error: Specified key was too long; max key length is 767 bytes→文字制限をかけるファイルを新規作成することで解決する

#ざっくり概要について#

このエラーは「Mysql2に、格納できる文字データは、767バイトまでだよ!今のままでは、Mysqlにマイグレーションできないよ!」という意味で理解しました。

そのエラーを踏まえて、この記事では、以下2つの方法を実践しました。

– [database.ymlが「utf8mb4」のまま、「文字制限をかけるファイルを新規作成」する方法](https://qiita.com/terufumi1122/items/9ea764618eba01144e09)
(@terufumi1122さんの記事のおかげで解決できました)
– 「文字制限をかける新規ファイル」を作成せずに、database.ymlを「utf8」に書き直す方法(この方法はやらないほうがいいと学びました)

その上で一番大事だなと思ったことは、 MySQLを使用する際、
「絵文字を使えるかどうか、要件定義の際にしっかり決める」ということです。

では、詳細にいきましょう!!!

#エラー内容について#

「Mysql2::Error: Specified key was too long; max

元記事を表示

Rails APIサーバー開発時に入れたGemの使い方 (rack-cors, rspec-rails, factory_bot_rails, rubocop)

# 前提
[docker-composeを用いたRailsのAPIサーバー環境構築](https://qiita.com/Teach/items/69a1e43562c0682b6777)
この記事でGemについてはあまり触れなかったので続き

# Gemfileの編集

下記のGemをインストールする。

“`Gemfile

gem ‘rack-cors’

group :development, :test do

gem ‘rspec-rails’, ‘~> 3.9’
gem ‘factory_bot_rails’
end

group :development do

gem ‘rubocop’, require: false
end
“`

# rack-cors
postman使う時に必要。
やっておかないとCORS問題発生してエラー出る。

config > initializers > cors.rb
を以下のように書くと、どこからでもAPI叩けるようになる。

“`cors.rb
Rails.application.config.

元記事を表示

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

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

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

“`Ruby:group.rb
ha

元記事を表示

【Rails】devise関連のルーティングまとめ

deviseも便利な機能が故、それぞれ独自のメソッドが自動で生成してくれるルーティングについて、こんがらがってしまいます。
そんな同じお悩みの方はぜひ。

#devise_for

“`routes.rb
devise_for :users
“`

“`bash:
$ rails routes

Prefix Verb URI Pattern Controller#Action

new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_pa

元記事を表示

undefined method `**_path’のエラー

## 記事の目的
初学者の為、間違っているところはご指摘頂けると幸いです。
備忘録・アウトプット目的で投稿です。

##エラー内容

“`new.html.slim
= form_with model: @review, local: true do |f|
.form-group
= f.label :purpose
= f.text_field :purpose, class:’form-control’, id: ‘review_purpose’
“`
において、以下の「undefined method `reviews_path’」というエラーが発生。
そもそもreviews_path定義していないけどな。

“`
ActionView::Template::Error (undefined method `reviews_path’ for #<#:0x00007fb7553fc9b0>):
“`

調べると、以上の「= form_with model: @review, local: true

元記事を表示

docker-composeを用いたRailsのAPIサーバー環境構築

# 筆者について
ProgateのRuby, Railsコースを一通りやった。
その後Dockerで環境作ってRailsでAPIサーバー作った。

# 本記事について
Progateではviewを含んだrailsの書き方を学んだが、APIサーバーとしてのみRailsを使いたかった。
また、dockerで開発したかったため公式の[クイックスタート](https://docs.docker.com/compose/rails/)を参考にRailsの開発環境を作った。
その過程で得られたノウハウをまとめる。

APIサーバーの開発で使うGemについては別記事で書く。

# 前提
Docker, docker-composeの使い方がわかること

# 環境

Ruby 2.7
MySQL 5.7
VSCode
Mac 10.14.5
Sequel Pro データベース見る用

# Rails new するまで

まずはプロジェクトフォルダを作成。ここではrails-sampleとした。
そして、この直下に Dockerfileを作成

“`Dockerfile
FROM ruby:2.7

元記事を表示

配列内の任意の文字を探す判定するメソッドの作り方

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

2.includeメソッドとは何か

3.どのようにプログラムしたか

1.結論
—————————————-
include?メソッドを使う!

2.include?メソッドとは何か
—————————————-
include?は配列の中に指定した要素が、あるかを判定するメソッドです!

3.どのようにプログラムしたか
—————————————-

“`ruby
def array_hello(strs)
if strs.include?(hello)
puts “True”
else
puts “False”
end
end
“`
“strs”の引数から”hello”という文字を探したいので、
strs.inc

元記事を表示

(ECサイト)注文情報入力時におけるバリデーション

#前提条件
ECサイトでECサイトで注文情報入力 ==> 注文確認画面の間に注文情報入力でバリデーションをかけたい

#1.よく使うバリデーション

“`rails:app/models/book.rb
validates :title, presence: true
“`
などの普段よく使うバリデーションは
booksテーブルにtitleというカラムがあり
データベースに保存される時、つまり @book.save(book_params)の時にtitleカラムが空白だとバリデーションがかかる。
しかし、ECサイトで注文情報入力 ==> 注文確認画面
 ==> 注文確定(ここで`.save`が行われる)というフローで実装する際、注文情報入力 ==> 注文確認画面の間に`.save`が発生しない為、モデルにかけるバリデーションをrenderで呼び出すことができない為if文で条件分岐を書いて`flash[:notice]`を使う必要がある。

#2.if文の実装
“` rails:app/controllers/order_controllers.rb
when 3

元記事を表示

Railsにフォントを導入するまで

#はじめに
ネット上には素晴らしいフリーフォントがたくさんあります。
デザインの表現の幅を広げるために是非、活用していきたいところ。
そこで、フリーフォントをRailsに導入していきます。

##フォントファイルの導入
ここでは導入したいフォントファイルを`smog.otf`とします。
`public`フォルダに`fonts`フォルダを作り、そこにフォントファイルを配置。

“`
– public
– fonts
– smog.otf

“`

使用するcssファイル(ここでは`sample.css`)に以下のコードを追加します。
`font-family`の名前は自由に設定できます、今回は`’Smog’`としましょう。
また`format`はファイルのフォーマットに合わせます。

| フォーマット | 拡張子 |
|:-:|:-:|
| format(‘woff’) | .woff |
| format(‘truetype’) | .ttf |
| format(‘opentype’) | .otf または .ttf |
| format(‘embedd

元記事を表示

【Rails】【bootstrap】レスポンシブに文字の大きさを変更したい

#前提
gem bootstrapを使用
#やりたいこと
Railsを使ってレスポンシブな画面を作る。
その際に文字の大きさをいい感じに大きくしたり小さくしたりしたい。
##結論

“`scss:app/assets/stylesheets/application.scss
body, html { font-size: 30px; }
@media screen and (min-width: 576px) and (max-width: 768px) { body, html { font-size: 30px; } }
@media screen and (min-width: 769px) and (max-width: 992px) { body, html { font-size: 30px; } }
@media screen and (min-width: 993px) and (max-width: 1200px) { body, html { font-size: 16px; } }
@media screen and (min-width: 1201px) {

元記事を表示

sidekiqのリトライ上限を設定して死んだjobをslackで通知する方法

#はじめに
非同期でjobを処理してくれる[sidekiq](https://github.com/mperham/sidekiq)を導入する中で、利便性を生かしつつも自分のアプリ専用にカスタマイズしたい、そんな時に役に立った設定をまとめています。

#sidekiqとは
sidekiqとは、非同期処理を可能にしてくれるライブラリです。複数のジョブを同時に実行させる時などに、各ジョブのqueueの名称を分けることで、処理の優先順位を指定することができます。似たようなライブラリにresqueやdelayed_jobなどがあるかと思います。
簡単に導入できるのですが、つまづいてしまったキューをデフォルトで25回だか26回だかリトライするとか、その後はDEADとなって実行していたキューのログが見られないなどといった面倒な点もあります。
そこでこの記事では、例外を投げた時などにいつまでもリトライせず上限を設定してDEADとし、その際にslackにキューの内容とエラーメッセージを投げるという設定をする方法についてお話しします。

#環境
Ruby 2.6.6
Rails 6.0.2
sideki

元記事を表示

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2) のエラー対処法

## 記事の目的
初学者の為、間違っているところはご指摘頂けると幸いです。
備忘録・アウトプット目的で投稿です。

##Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

初学者の私は、こちらのエラーに何度も苦しみました。

このエラー以外にもCan’t connect to local MySQL server through socket ‘/tmp/mysql.sock'(38)だとか、ERROR! The server quit without updating PID fileというエラーにも悩まされました。記事をみてみると、対処法として①PIDファイルの作成②権限の変更③再インストール対応が挙げられていましたが、色んな記事を試してもダメでした。(初学者なので、記事の理解・原因の理解ができていないからだと思います。)
同じように悩まれている初学者の方が私の解決策が参考となればと思い、残したいと思います。
(原因の理解はまだできていないので、解説抜きです。)
なので、試す場合は自

元記事を表示

Rails6でActiveStorage導入でNameError: uninitialized constant ::Analyzableエラーが発生した対処

### エラー内容
“`
NameError: uninitialized constant #::Analyzable
from /bundle/ruby/2.7.0/gems/activestorage-6.0.3.3/app/models/active_storage/blob.rb:26:in `
“`

### 発生した環境
– rails 6.0.3.3
– ruby 2.7

### 対処
https://railsguides.jp/upgrading_ruby_on_rails.html#rails-6でclassicモードのオートローダーを使う方法

“`rb
# config/environments/development.rb

config.autoloader = :classic
“`

### 関連 Issue
https://github.com/rails/rails/issues/38681

元記事を表示

バリデーションメッセージを Decorator で加工する

のっぴきならない事情があり、フォームの入力パターンに応じて、バリデーションメッセージを生成後に加工したかったのでメモ。
例えば、下記のようなフォームがあったとする。

“`ruby:new.slim
= form_for post_form, url: confirm_post_path do |f|
– if post_form.errors.present?
ul
– post_form.errors.full_messages.each do |msg|
li = msg
“`

しかし、フォーム内の特定の選択肢を選んだ場合に、バリデーションメッセージを変えるという要件が加わったとする。
この場合、errors.full_messages は Array なので、Decorator で中身を1件ずつチェックして力技で置換した。

“`ruby:new.slim
= form_for post_form, url: confirm_post_path do |f|
– post_form_decorator = ::PostFor

元記事を表示

OTHERカテゴリの最新記事