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

Ruby関連のことを調べてみた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 ‘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

元記事を表示

【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

元記事を表示

(Ruby on Rails6) テーブルへのデータの作成

#まえがき
テーブルでのデータ設定で、便利かなと思ったので、1つ・複数 のテーブルへのデータ設定を記録します。
いずれも、最後に save を行いますので。忘れずに!
データを取り出す時に、エラーになってしまいますよ!!

#テーブルへのデータの作成
##1つのデータ設定
“`terminal:コマンド
rails console

変数1 = モデル名.new(カラム名: “内容”)
test1 = Test.new(description: “smple_text”)

変数1.save
test1.save
“`

##複数のデータ設定
先のコマンドに , を入力します。

“`terminal:コマンド
rails console

変数1 = モデル名.new(カラム名: “内容”,カラム名: “内容”)
test1 = Test.new(description: “smple_text”,title: “smple_title” )

変数1.save
test1.save
“`

#あとがき
ここまで読んでいただき、ありがとう

元記事を表示

(Ruby on Rails6) モデルとテーブルを作成する方法

#まえがき
今回は、Ruby on Rails6 でデーターベースのテーブルを作成する方法を忘却録として残します。

#モデルとテーブルを作成する方法
bin/ ・・・Linux の開発環境で使用します。
(私はMAC{Unix}での開発環境で不要な文字ですが、知識として持っておくといいと思います。)
また、テーブル名前は “Form” の様に 頭文字を大文字にすると良いです。
##モデルと1種類のカラムの作成

“`terminal:コマンド
$ bin/rails g model Smple_form title:string
$ bin/rails g model デーブル名 カラム名:データ型
or
$ bin/rails generate model Smple_form title:string
$ bin/rails generate model デーブル名 カラム名:データ型
“`
##モデルと複数のカラムの作成

“`terminal:コマンド
$ bin/rails g model S

元記事を表示

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

元記事を表示

Rakeタスクを定義してみよう。

## Rakeタスクってなに
タスクってなに、、、「やること」っていう意味かな。はじめて聞いた時はそう考えましたが、調べてみるとRuby on Railsにはタスクというものが存在するらしい。

### Rakeタスクとは
このタスクという機能は、いちいちアプリケーションを立ち上げるなくてもターミナルから任意の処理を実行することができるものらしい。自分が携わっているアプリケーションでは、開発段階でサンプルのデータが必要だったので、それをこのタスクというものを使って作成した。

## タスクを作成してみる
“` ruby
rails g task sample
“`
これで“sample.rake“というタスクに関するファイルを作成する。
“lib/tasks“にsample.taskという名前のファイルを作成。

“` ruby
namespace :greet do
end
“`
作成したファイルには、デフォルトで上のようなコードが書かれている。
この中を自分がタスクとして行いたい処理をコマンド一つで実行されるように書いていく。

“` ruby
# タスク名前

元記事を表示

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

【概要】
—————————————-
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

元記事を表示

特殊変数$1, $2, $3 … で巨大な整数を使おうとすると、警告が表示される

Rubyには、`$1, $2, $3 …`という特殊変数があり、`$n`には最後に成功したパターンマッチで n 番目の括弧にマッチした値が代入されます。

“`ruby
“abc” =~ /(.)(.)(.)/
p $1 #=> “a”
p $2 #=> “b”
p $3 #=> “c”
“`

[2020/09/26現在のるりま](https://docs.ruby-lang.org/ja/latest/method/Kernel/v/1.html)には

> 番号 n はいくらでも大きな正整数を利用できます。

とありますが、実際には超巨大な値を使おうとすると、warningが表示されます (遊んでいるときに気が付いた)

“`
$ ruby -e ‘$9999999999999999′
-e:1: warning: `$9999999999999999’ is too big for a number variable, always nil
“`

こうなると`$n`のnとしてどれだけの値が使えるのか気になってくるので、簡単な二分探索を使った以下のコードで調べてみた

元記事を表示

FizzBuzz問題の備忘録

昨日のドリルで登場したFizzBuzz問題。

模範回答としては、

“`
def fizz_buzz
num = 1
while num <= 100 do if num % 15 == 0 puts "FizzBuzz" elsif num % 3 == 0 puts "Fizz" elsif num % 5 == 0 puts "Buzz" else puts num end num = num + 1 end end fizz_buzz ``` というのが正解だったけど、 rubocopを使ったところ、 ``` def fizz_buzz num = 1 while num <= 100 if (num % 15).zero? puts 'FizzBuzz' elsif (num % 3).zero? puts 'Fizz' elsif (num % 5).zero? puts 'Buzz'

元記事を表示

【Ruby】getsメソッドの注意点

標準入力からの文字列との比較処理を行ったところ、なぜかうまく行かなかったので
その原因と解決策を備忘録として記載します。

## 問題点

`gets`メソッドは標準入力からの文字列を受け取るためのメソッドです。
このメソッドを利用して取得した入力文字列と別の文字列を比較しようとすると
思い通りの結果が得られませんでした。

“`ruby
input = gets # hogeを入力
bool = (input == ‘hoge’)
print bool
“`

“`
false
“`

同じ値の文字列同士を比較してるはずなのになぜか`false`が返ってきました。

## 原因

調べたところ、どうやら`gets`メソッドは標準で末尾に**改行コード(\n)**を追加するみたいです。

“`ruby
input = puts # hogeを入力
p input
“`

“`
“hoge\n”
“`

改行コードが含まれている状態で比較しようとしていたので、比較しても弾かれてたみたいです。

## 解決策

末尾の改行コードを削除すればよさそうなので調べてみたところ、

元記事を表示

バリデーションメッセージを 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カテゴリの最新記事