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

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

Railsで「いいね!」機能を作る – ①アソシエーションに別名をつける

### 背景
最近人にプログラミングを教える機会があるのですが、使っているテキストに、初学者さんにはまあまあ難しそうだなー。と思える記述がありました。

自信を持って教えられるか不安なところもあったので、勉強がてら、噛み砕いてまとめてみようと思います。

### データ構造
基本のデータ構造は以下の通り。
Twitterみたいなアプリで、ユーザー(`users`)はたくさんの投稿(`posts`)を持っている。そして、自分の投稿も含む全ての投稿に「いいね!」(`likes`)を付けられる。という感じです。

[![Image from Gyazo](https://i.gyazo.com/fcef6fe2644d5ddbf2275841de1d7ca0.png)](https://gyazo.com/fcef6fe2644d5ddbf2275841de1d7ca0)

シンプルな構造なのですが、後半、ちょっとひねりが必要でした。

### アソシエーションを書き起こしてみる
まずは、Railsの規則通りにシンプルに書けるところからアソシエーションを書き起こしてみます。

“`Ruby

元記事を表示

Rails Tutorial 第12章 完了

##2020/8/22 1.5時間
12.1.2まで進めました。
##2020/8/23 2.0時間
12.3.2まで進めました。
##2020/8/24 0.5時間
リスト12.18の途中まで進めました。
##2020/8/25 0.5時間
##2020/8/26 0.5時間
リストの入力間違いでエラーになっていたのをデバッグしてやっと動きました。テキストから手打ちしていると、入力ミスで結構バグが出ることが分かります。
##2020/8/27 0.5時間
##2020/8/28 1.0時間
##2020/8/29 4.0時間
うち1.5時間はSendGridのエラー調査です。
##2020/8/30 0.5時間
Sendgridはあいからずエラーですが、先に進めることにしました。

12章を完了です。
所要時間は11.0時間です。

##digestは作るたびに違う値になる
tokenが同じ値ならdigestは何度作っても同じなのかと思ったのですが、2回実行してみたところ違う値になっていました。

“`bash
>> a.password_digest
=> “$2a$10$92Y

元記事を表示

ActiveRecord::NotNullViolation in Deviseエラー

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

2.ActiveRecord::NotNullViolationtとは何か

3.なぜActiveRecord::NotNullViolation in Deviseになるのか

4.どのように解決するか

5.補足

1.結論
—————————————-
db/migrate/””””_devise_create_”””””.rbに
記載してある“t.string password(またはpassword_confirmation)”の記載を削除する!

2.ActiveRecord::NotNullViolationtとは何か
—————————————-
![スクリーンショット 2020-08-29 20.47.37.png](https://qiita-image-store

元記事を表示

【Rails】NoMethodError: undefined method `new’ for BigDecimal:Classの対処法

#はじめに
`NoMethodError: undefined method ‘new’ for BigDecimal:Class`の詳しい対処法が日本語であまり載ってなさそうなので、備忘録として残しておきます。

#対処法
結論として
`Gemfile`の`bigdecimal`を下記内容に修正したら、うまく行きました。

“`
gem ‘bigdecimal’, ‘1.3.5’
“`

gemの内容を書き換えたのでその内容を反映させるために、`bundle install`を行なってください。

“`
$ bundle install
“`

#意味

|バージョン |特徴 |サポートされているRubyのバージョン範囲 |
|—|—|—|
|2.0.0 |BigDecimal.newとサブクラス化の使用ができない |2.4 .. |
|1.4.x |BigDecimal.newとサブクラス化を使用の際、警告がいつも表示される |2.3 .. 2.6 |
|1.3.5 |警告なしでBigDecimal.newとサブクラス化を使用できる |..

元記事を表示

【Rails環境構築】Docker + Rails + MySQL (初心者も30分でOK!)

### Dockerを使った環境構築
「環境構築はコードを書くよりも難しい」と聞いたことがあります。

### Dockerは簡単!
何故かと言うと、、、
**コピペするだけ**でいいから
ただし、理解するまで少し時間がかかるかも、、、
まずは簡単な概要から

### Docker
仮想環境を構築するための道具

### コンテナ
仮想環境そのもの
(DockerはDockerエンジンの上にコンテナが動く)

### イメージ
Dockerコンテナを実行するために必要なもの。

### 環境構築の手順
①.“`プロジェクト(ディレクトリ)を作成し、移動する“`

$ mkdir アプリ名
$ cd アプリ名
②.“`Dockerfile、docker-compose.yml、Gemfile、Gemfile.lockを作成する“`

$ touch Dockerfile docker-compose.yml Gemfile Gemfile.lock
③.“`エディタを開き、Dockerfile、docker-compose.yml、Gemfileを下記か

元記事を表示

クラスの情報を継承したクラスの作り方

##内容
複数のクラスに同じメソッドを定義したい場合、それぞれのクラス全てにそのメソッドを定義すると、同じ記述を何度も繰り返す事になってしまいます。
(例1)
クラス1  クラス2   クラス3
メソッドA メソッドA  メソッドA
メソッドB メソッドC  メソッドD
複数のクラスが同じメソッドを持つときにクラスが増えれば増えるほどコード量が多くなり、管理も難しくなります。これを防ぐためにクラスの継承について学んでいきましょう。
##クラスの継承とは
あるクラスに定義されたメソッドを、別の新規クラスで利用できるようにした上でクラスを定義することを継承と言います。

クラスの継承には、親クラスと子クラスの関係があります。元となるクラスを親クラス、親クラスのメソッドを引き継ぎ新しく作成するクラスを子クラスと呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675525/8c07b3d0-649b-7177-3cbc-cdf6edb74c9a.png)
パトカーやトラックの上

元記事を表示

【Rails】テーブルにカラムを追加する際、キャメルケース以外で記載したらどうなるの?

“`ruby:qiita.rb
# 定義
rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型
# 例
rails g migration AddNicknameToUsers nickname:string
“`

ターミナルで、上記コマンドを実行すると、マイグレーションに新しいカラムを追加する事ができます。

そこで以下の2つの疑問を感じました。

#疑問1:Addカラム名To追加先テーブル名の「カラム名」と「テーブル名」を大文字にしなかったら(キャメルケースにしなかったら)どうなるの?

***結果***
**マイグレーションファイルは作成されるもののSequelPro上のカラムはうまく生成されなかった。**

【ターミナル上】

hogehoge % rails g migration AddnicknameTousers nickname:string
Running via Spring preloader in process 40102
invoke active_record
create

元記事を表示

RailsでXSSを回避しつつ改行を維持して出力したい場合の書き方

Scriptタグを含む以下の文字列をいろんな方法で出力して、違いを比較します。

“`html:@hoge

“`

## そのまま出力
“`erb:erb
<%= @hoge %>
“`
“`:出力

“`
### 結果
XSSは回避できるが、改行やスペースが反映されない

## html_safe
“`erb:erb
<%= @hoge.html_safe %>
“`
“`:出力
Scriptが実行される!
“`
### 結果
XSSを誘発します。`html_safe`はその名前に反して全然safeじゃないです。

## simple_format(`@hoge`, sanitize: true)
“`erb:erb
<%= simple_format(@hoge, sanitize: true) %>
“`
“`:出力
alert(‘you are an idiot’);

元記事を表示

【ruby】map, injectを使ってeachを簡略化する

rubyの繰り返し処理として有名なのが、**eachメソッド**ですが、必ずしもeachが最善という訳ではなかったりします。

あるパターンの時は、違うメソッドを使った方が簡略化して、実装できる場合があります。
今回は、パターン別で、簡略化する書き方をご紹介します。

#すでにある配列から、要素を変化させた新たな配列を作成する時

`map`メソッドを使っていきます。

###演算子を使っての変化

“`ruby

# eachの場合

list = (1..5).to_a
list_double = []

list.each do |i|
list_doubule << i * 2 end p list_double # [2, 4, 6, 8, 10] ``` ```ruby # mapの場合 list = (1..5).to_a list_double = list.map{ |i| i* 2 } p list_double # [2, 4, 6, 8, 10] ``` ###インスタンスメソッドを使っての変化 ```ruby # eachの場合

元記事を表示

アップロードした画像の即時プレビュー法

画像を選択し、画像をDBに登録する前にプレビュー表示する方法をまとめたいと思います。

[環境]
Rails 5.2.4.3
ruby 2.5.7
すぐにプレビューできるようにjQueryを追加
画像投稿用gemはRefile

![60CBE45F-331A-4C38-A395-39FE36F347A3_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684386/0fb4f9d3-6068-799d-226f-a9619efeec96.jpeg)

![スクリーンショット 2020-08-29 15.19.49.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684386/1c3d5293-d498-a420-fa54-46c249c650c8.jpeg)

![スクリーンショット 2020-08-29 15.19.52.jpeg](https://qiita-image-store.s3.

元記事を表示

Railsプロジェクトを作ろうとしたら躓いた人のメモ

(筆者の現環境がMacなので一旦Mac編のみ。Windowsに関しては追々書くかも)

## 0. 結論
– 何はともあれrbenvをインストール。話はそれから。

## 1. プロジェクト作成 ([参考](https://openbook4.me/projects/92/sections/488))
Terminalで
“`$ rails new {プロジェクト名}“`
を実行すると、Railsアプリの型となるファイルが生成されたプロジェクトディレクトリが作成される

## 2. 各種gemをインストール([gemとは](https://techplay.jp/column/529))
1.で作成したプロジェクトディレクトリに入り
“`$ cd ./{プロジェクト名}“`
↓のコマンドを実行
“`$ bundle install –path vendor/bundle“`

私はここでエラーが出た。
エラー文はこちら(エラー部分だけ抜粋)

“`
An error occurred while installing nokogiri (1.10.10), and B

元記事を表示

Railsの中間テーブルをjquery,json非同期保存してみた

#はじめに
Railsでの中間テーブルをjquery,jsonを使って実装してみました。

##理由
個人的にあまりRailsに依存した書き方をしたくなかったのが理由でフロントエンドの勉強も踏まえて実装してみました。(Postモデルは全て非同期での実装をしてます。)

##環境

– Rails 5.2.4
– jquery

##モデル構成

*__Userモデル作成済み前提__

(__Post.rb__)

– __has_many :post_categroies, dependent: :destroy
has_many :categories, through: :post_categories__

(__Post_category.rb 中間テーブル__)

– __belongs_to :post
belongs_to :category__

(__Category.rb seed.rbにカテゴリー名登録済み__)

– __has_many :post_cates, dependent: :destroy
has_many :posts,

元記事を表示

【enum_help】enum_helpを用いて日本語表示されたセレクトボックスを作る!

# 概要
enum_helpというgemを用いて、日本語で表示されたセレクトボックスを作った過程を備忘録として記録します。

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

# 過程
## 1.準備
Gemfileにenum_helpを追加します。

“`Gemfile
gem ‘enum_help’
“`

ターミナルで「bundle install」します。

“`ターミナル
bundle install
“`

## 2.テーブルにenumのカラムを追加
対象のカラムを追加します。

“`db/migrate/20xxxxxxxxx_add_place_to_datespots.rb
class AddPlaceToDatespots < ActiveRecord::Migration[5.2] def change add_column :datespots, :place, :integer end end ``` ターミナルで「rails db:migrate」します。 ```

元記事を表示

【Rails】お気に入り機能

# 実装したい機能
– 投稿表示ページに、お気に入りボタン設置
– 記事投稿者でない、ログイン中のユーザーのみお気に入り登録できる。
– 記事投稿者、未ログインは、お気に入り登録できない。
– お気に入りボタンをクリックしたら、Ajax通信でデータ保存。
– ユーザーのマイページに、お気に入りリスト一覧を表示。

# 実装の手順
1. お気に入りテーブル作成(ユーザー/投稿テーブルの中間テーブルに相当)
1. ルーティング: 記事投稿のルーティングにネストの形で記述。
1. お気に入りコントローラー: create、destroyアクションを定義。
1. Userコントローラー: ユーザーのマイページで呼び出す
1. ビュー: 投稿表示ページに、お気に入りボタン設置。マイページに、お気に入り一覧表示。

## 1. お気に入りテーブル作成
– 誰が、どの記事に、お気に入りしたかを管理したいので、favoriteモデル(user_id、post_idカラム)を生成。

“`rb:ターミナル
% rails g model Favorite user:references post:

元記事を表示

Webサーバーを設定する

##はじめに
「AWSのサーバーを利用する」ための手順を5つに分けて書いています。

記事は以下にまとめておりますのでご確認ください。

①[EC2の初期設定](https://qiita.com/maca12vel/items/902dde37a267ceca1c53)
②[本番環境でデータベースを作成する](https://qiita.com/maca12vel/items/68d6ae3d4308e330847d)
③[EC2のRailsを起動する](https://qiita.com/maca12vel/items/2a04d39f958b53d687e2)
④[Webサーバーを設定する](https://qiita.com/maca12vel/items/35f9fb73bb21cb4869fb) ← イマココ
⑤[デプロイを自動化する](https://qiita.com/maca12vel/items/7b33dd6ea1ad556e3fec)

##Webサーバーの役割
Webサーバーの役割は以下の3つ
・静的なコンテンツをレスポンスとしてクライアントに返す処理

元記事を表示

save!メソッド

フリマアプリを作成中、キーは取得できているのにデータが保存されない原因が分からなかった。メンターさんに質問したところ原因を探る方法を教えてくれたのでメモ。

# save/save!メソッドとは
データを保存するためのメソッド。

### saveメソッド
saveメソッドは、保存に成功したらtrueを、保存に失敗(バリデーションに失敗)したらfalseを返す。

### save!メソッド
save!メソッドは、保存に成功したらtrueを返すが、保存に失敗(バリデーションに失敗)したら例外が発生します。だから、保存できなかった場合の処理はrescue節で行う必要がある。

■私の場合、`binding.pry`を使用したところ、キーは取得できていたので、`@user.save!`を使って原因を探った。
↓保存できなかった時の記述

“`
[8] pry(#)> @user.save!
(0.2ms) BEGIN
↳ (pry):12
User Exists (13.4ms) SELECT 1 AS

元記事を表示

Railsのログ出力をカスタマイズする

RailsのログにプロセスIDを出すようにしたかったのでログ出力の変更方法を調べました。

## 独自フォーマッターの作成
標準ライブラリのフォーマッター(Logger::Formatter)を継承してcallメソッドを上書きします。

“`ruby:log_formatter.rb
class Logger::CustomFormatter < Logger::Formatter cattr_accessor(:datetime_format) { "%Y/%m/%d %H:%M:%S" } def call(severity, timestamp, _progname, msg) "[#{timestamp.strftime(datetime_format)}.#{format('%06d', timestamp.usec)}] (pid=#{$PROCESS_ID}) #{severity} -- : #{msg.class == String ? msg : msg.inspect}\n" end end ``` 今回は通常のログに加えて`(pid=#

元記事を表示

【Rails】エラー文が出ないのに、データが保存できない

初投稿です。間違えなどありましたら、ご指摘ください。
######エラーが出ないのに、データが保存できない
個人的によく引っかかるため、投稿します。
解決の参考にしてください。

######解決策
modelファイルにoptional: trueを追加(belongs_toのあと)
(デフォルトでは、references型のカラムが空で保存できないようになっているから?)

######前提
taskモデル(作業)と、start_timeモデル(開始時間)を作りました。
開始時間をつけずに、作業を保存します。
ちなみに、start_timeにはtask_idが保存されるようにします

“`
start_timeモデルのマイグレーションファイル

t.references :task

“`

保存できませんでした。

######修正した前と後

“`
task.rb
修正前

belongs_to :start_time

“`

“`
task.rb
修正後

belongs_to :start_time, optional: true

元記事を表示

optional: trueをつけるその前に!デバッグの一例

## 概要
「ActiveRecord::RecordInvalid: Validation failed: Users must exist」というエラーが出たので検索をしていると、正しくなさそうな「optional: true」を使用した回避策が散見されたのでデバッグの流れを中心に書いてみました。
学習し始めは、自分でデバッグしようにも**何をすればいいのか分からない!**ということが多かったので何かの参考になれば嬉しいです。

## エラーの発生状況と原因
### エラーの発生状況
[ミニブログにコメントをつけるアプリ](https://mini-blog-with-comment-unction.herokuapp.com/)を作っている最中にコメントの投稿をsaveすると、一見正しく見えるのにsaveがfalseになっていた。

### 原因
アソシエーションが正しくなかった。

“`ruby:user.rb
class User < ApplicationRecord has_many :blogs, dependent: :destroy end ``` ```r

元記事を表示

GraphQLで変数を用いたクエリを作成する方法【Ruby on Rails使用】

#はじめに
※本記事は
前回の記事「[RailsでGraphQL APIからデータを取得・表示する](https://qiita.com/hinokage/items/243b55477172317eb126 “Qiia”)」の追記内容です。
よろしければ前回の記事から読んでいただけると有り難いです(ダイレクトマーケティング

前回の記事で紹介したGraphQLのクエリの書き方において
「変数をクエリの中で使うにはどうすればいいの?」と疑問に持つ方がいらっしゃるかと思います。

私の場合は
REST APIで取得したデータをGraphQL APIに渡したかったので
どうすればクエリに変数を組み込めるんだろう?という疑問を持ちました。

で、「GraphQL クエリに変数渡す」とかググると
__やっぱり分かりやすい記事がヒットしない!__

というわけで今回も、初学者の方向けに分かりやすく(自分も初学者ですが…
GraphQLのクエリで変数を使う方法を解説しようと思います。

#静的なクエリ
今回は以下のクエリを例に説明します。

“`
query {
repositoryO

元記事を表示

OTHERカテゴリの最新記事