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

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

【Rails/simple_format】フォームで入力した改行を反映させるヘルパーメソッド

# 状況

* フォームで改行を入力

* 出力時に改行が反映されない

![demo](https://gyazo.com/8629b45baabdb38fc768268d5a525ade/raw)

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

* Bootstrap : 4.3.1

# 学んだコード

* simple_format : ヘルパーメソッド。改行をpタグやbrタグで表現

* hオプション : XSS対策。simple_formatにエスケープ機能を付与

【参照】

* simple_format | Railsドキュメント

* simple_formatの使い方 | Qiita

元記事を表示

【Rails/Heroku】push後のエラー解消手順

# 状況

* 開発環境でアプリケーションに追加実装 (コメント機能の実装)

* デプロイ先のHerokuにpush

* Heroku上アプリでコメントを投稿しようとしたところエラー

![demo](https://gyazo.com/fe06ac1a3aa02f51465eb94ee18a0310/raw)

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

# 対処の手順

## 1. ターミナルでログを確認

Heroku上のアプリを操作した際は、ターミナルでコマンドを打つとログを確認できます。

“`terminal
% heroku logs –tail –app アプリ名

# –tailは最後の10行を表示するオプション
“`

実行後、エラー箇所を抜粋したのがこちら。

![demo](https://gyazo.com/6db73fbc980e736c5791c9ab7959016a/raw)

元記事を表示

カラムの型早見表

# 早見表

| 型 | 概要 |
|:-:|:-:|
| primary_key | プライマリキー |
| string | 文字列(1〜255文字) |
| text | 長い文字列(1〜4294967296文字) |
| integer | 整数(4バイト) |
| smallint | 値の範囲が-32768~32767の整数を扱うデータ型 |
| bigint | 整数(8バイト) |
| float | 浮動小数 |
| decimal | 精度の高い少数 |
| numeric | 数値 |
| datetime | 日時 |
| timestamp | 更新時間 |
| binary | バイナリーデータ |
| boolean | 真偽値 |
| char | 固定長文字列のこと。0~255まで |
| vachar | 可変長文字列のこと。0~65535まで |

元記事を表示

【Bootstrap】レスポンシブWebデザインに対応する「グリッドシステム」の使い方

# Bootstrapのグリッドシステム

* Bootstrap側がメディアクエリを用意

* HTMLタグにクラスをつけるだけでレスポンシブデザイン化

* 使うためには決まった書き方がある

今回は初歩の初歩ということで、下記のGIFのような構造を作りました。それを解説します。

![demo](https://gyazo.com/bffd9489771e3d5f0e4feb076bcf53db/raw)

# 環境

* macOS Catalina 10.15.6

* Bootstrap 4.3.1

* Rails 6.0.3.4

# 今回のコード

先に、今回実装したコードを示します。見慣れないと難しいですが、1つずつ解説していきますので安心してください。

“`ERB
# index.html.erb

< 576px で縦並び

≧ 576px で幅半分

元記事を表示

【Rails/一意性制約】モデルのバリデーションをコンソールで確認する方法/複数カラムへの一意性制約

# 状況

* userとroomを紐付けるpermissionsテーブル(部屋に入れる許可証を管理)を作成したい

* references型でuser, taskをカラムにもつ

* 既にテーブルに存在する(user_id, task_id)のセットが入力された際、保存しない制約

* このバリデーションが正常に動作するかをコンソールで確認したい

「一意性制約」を使えば実現できるこちらのバリデーション。

今回はこれがちゃんと実装できているか、rails cで立ち上げたコンソールでの操作についての記録です。

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

# 今回のコード

“`app/models/permission.rb

class Permission < ApplicationRecord belongs_to :user belongs_to :task validates :user_id, un

元記事を表示

【Rails/ルーティング】自作したディレクトリ内のコントローラを参照する方法

# 概要

かんたんログイン(テストユーザーログイン)実装にあたり、普段しない形でコントローラファイルを作成しました。

その際に「え、これどうなってんの?」と感じたことがあったのでそれを記録します。

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

# 今回やりたいこと

* [URL] localhost:3000/admin/usersにアクセス

* app/controllers/admin/users_controller.rbのindexアクションへルーティング

* index.html.erbを表示

# まず、普通のusersコントローラで動作確認

ターミナルで以下のコマンドを入力します。

“`terminal
% rails _6.0.0_ new controller-app -d mysql

% cd controller-app

% rails db:migrate

% rails g contr

元記事を表示

RSpecにおけるモックとスタブ

参考文献
Everyday Rails – RSpecによるRailsテスト入門
https://leanpub.com/everydayrailsrspec-jp

##モックとスタブ
###モック
テストのために使用される、本物のオブジェクトのフリをするオブジェクトである。
また、テストダブルとも呼ばれる。
モックはデータベースにアクセスしないため、テストにかかる時間は短くなる。

###スタブ
オブジェクトのメソッドをオーバーライドし、事前に決められた値を返す。
スタブは、呼び出されるとテスト用に本物の結果を返す、ダミーメソッドである。スタブをよく使うのはメソッドのデフォルト機能をオーバーライドするケースです。特にデータベースやネットワークを使う処理が対象となる。

##実際に書いていく
Userオブジェクトにあるname(first_name + last_nameの結合)メソッドをNoteオブジェクトにデリゲートして属性追加している。

Userの属性 first_nameとlast_name

Userのnameメソッドで first_nameとlast_nameを結合

元記事を表示

【Rails】twitterログイン導入時にハマったActiveSupport::MessageVerifier::InvalidSignatureの解決方法【ActiveStorage】

現在完成間近の個人開発アプリにtwitterログインを導入したときにかなりハマったので備忘録として解決策をこちらに残しておきます。

#エラー内容
twitter連携したときに、twitterアカウントで設定されている画像をActiveStorageでアタッチして、デフォルトのプロフィール画像に設定するという実装を行ったときに以下のようなエラーが起きました。(もちろん同時にtwitterのアカウント名も引っ張て来てます)

“`
ActiveSupport::MessageVerifier::InvalidSignature
“`

画像に関するコードをコメントアウトしたらエラーが消えたので、ActiveStorageが悪さをしているようでした。

画像のURLで直接アタッチしようとすると、不正な署名?としてActiveStorageから認識されてしまうようです。

#解決策
流れとしては open-uriを使いtwitterの画像をダウンロードして、 ActiveStorageへ直接 IO インスタンスをアタッチするといったイメージです。(多少表現に誤謬がありましたらご指摘いただ

元記事を表示

graphql-ruby: controller内でqueryまたはmutationの名前を取得する方法備忘録

タイトルの通り。

`GraphQL.parse`を使って取得できる。

“`ruby
GraphQL.parase(params[:query]).definitions[0].selections[0].name
“`

もっと良い方法ご存知の方教えてください。

元記事を表示

コマンドの仕組みと管理ツール

#コマンドの仕組みと管理ツール
#目的
* 環境構築で使用したツールとその仕組みを理解すること
* パッケージ管理ツールで管理する理由を理解すること

#シェル
##簡単に言うと「ターミナルとOSを繋ぐ窓口役」のような存在。ターミナルから入力されたコマンドを読み取って、OSに対して指示を渡し、結果をターミナルに返して表示や実行などの動作をさせる
#zsh
##zshはシェルの1つ。ターミナルでecho $SHELLとコマンドを実行すると現在使用しているシェルはzshであることがわかる
#PATH
##「環境変数」と呼ばれるOS用の変数のことです。PATHには、複数の絶対パスの情報が保存されている。コマンドが入力されたときに、シェルはPATHに記述されたパスのディレクトリ内のファイルを検索する。つまり、PATHに絶対パスを保存してアプリケーションのありかを示せば、どこからコマンドを実行してもアプリケーションのコマンドを打つことができる
#コマンドラインツール
##コマンドで操作するアプリケーションのまとまり。コマンドラインツールを導入することで、OSが初めからコマンドで操作できるアプリケ

元記事を表示

RSpecのテストコード実行編

#はじめに
 以前に、RSpecの導入方法やテストコードの書き方については投稿したが、実際のテスト方法については説明していなかったので、今回書いたテストの実行方法について見ていく。

【以前の投稿】
[RSpec導入後、モデルの単体テストコードを書き始めるまで](https://qiita.com/TerToEer_sho/items/2d42c0cdb7a623a32119)

[もう迷わない!RSpec導入の流れ](https://qiita.com/TerToEer_sho/items/472e14df6fbb8e83ebf9)

##書いたテストコードの実行方法

カレントディレクトリが作成中のアプリケーションであることを確認の上、ターミナルで

“`bash
bundle exec rspec spec/models/ファイル名
“`

ファイル名は、実際にテストコードを記述したファイルのこと。

テストがうまくいけば、エラーもなく、examplの項目(日本語で何をチェックしたいか記述している部分)が全て緑色になる。

##binding.pryで止めた場合
“`
%

元記事を表示

validationを設定していないのにエラーが出るとき

#なぜだ

“`
ActiveRecord::RecordInvalid: バリデーションに失敗しました
“`
modelを確認してもマイグレーションファイルを確認してもどこにも
validationの設定はない。

それなのに出続けるエラー。

#原因
Rails5からの変更でbelongs_toに存在性のvalidationが設定されたようです。

#なので以下のように変更

“`
belongs_to :post_id, optional: true
“`

#参考
[https://railsguides.jp/association_basics.html](rails)

[https://teratail.com/questions/65278](rails)

元記事を表示

色々なrailsのマイグレーション操作

#この記事で扱うこと

– NOT NULL制約の付いたカラムに制約を追加/削除する方法
– 複数カラムを紐付けたカラムからindexを削除する方法
– reference型で作成した外部キーをつけたカラムを削除する方法

#NOT NULL制約を追加/削除する
##NOT NULL制約を追加したいとき

“`
def up
change_column_null :posts, :content, false
end

def down
change_column_null :posts, :content, true
end
“`
ポイントはchangeメソッドを使用せず、up/downメソッドを使用すること

##NOT NULL制約を削除したいとき

“`
def up
change_column_null :posts, :content, true
end

def down
change_column_null :posts, :content, false
end
“`

#複合キーindexを付けたカラムからindexを削除する

“`
def

元記事を表示

Ruby on Railsの新しいプロジェクトでSQLite3からPostgreSQLに変更する

Ruby on Railsで作った新しいプロジェクトのデータベースを変更する手順のまとめです。

# 環境
– mac OS Catalina 10.15.6
– Ruby 2.6.3
– Rails 6.0.3.2

# SQLiteからPostgreSQL変更する理由
Ruby on Railsのデータベースの標準はSQLite3ですが、HerokuにデプロイするときにSQLite3だとエラーになります。
`rails new`した時点でPostgreSQLに変更しておくと、あとでデータ移行する手間が省けます。

# Postgresを使う準備
## macにHomebrewをインストールする
`Homebrew`のインストールに必要となる`xcode`をまずインスロールします。

### xcodeをインストールする
“`
xcode-select –install
“`

### Homebrewをインストールする
“`
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com

元記事を表示

Rails6.0で複数のデータベースを利用する

Rails6.0から複数のデータベースを標準機能として利用できるようになりました
複数のデータベースを利用することで、例えばプロジェクトの規模が大きくなった時にスケールしやすくなることや、コネクション数を増やすことができるなどの利点があります

この記事ではRailsアプリケーションで2つのデータベースの利用と、データベースのreplicaの利用のやり方を試してみます

作成したソースコードをGitHubで公開しています
https://github.com/youichiro/rails-multiple-db-sandbox

## やったこと

– 複数のデータベースの利用
– commonデータベースとschoolデータベースを作成
– それぞれのデータベースのモデルを作成
– primary / replicaを利用
– commonデータベースのreplicaと、schoolデータベースのreplicaを用意
– GETリクエストはreplicaが呼び出されることを確認
– 異なるデータベースのテーブル間のJOINはできないことを確認

## 複数データベース

元記事を表示

なぜフルスクリーン要素のwidthは100%でheightは100vhなのか

# はじめに
某プログラミングスクールのカリキュラムでRailsでアプリケーション作成中、背景画像のようなフルスクリーン表示の要素について、viewportを考慮してサイズ設定をする状況になりました。

“`css
.hoge {
width: 100vw;
height: 100vh;
}
“`
と記述したのですが、模範解答は

“`css
.hoge {
width: 100%;
height: 100vh;
}
“`

見え方は一緒なのに、この違いは何故…と気になり色々検索。

**要素をページの高さいっぱいに配置する場合は100vhを使い、
要素のページの横幅いっぱいに配置する場合は100%を使うのが多い**

という内容の解説をいくつか目にしました。
何故使い分けるのかが気になり、調べてみました。

# 考察・検証
まずはおさらいから。

**viewport**
ブラウザで表示されている領域のことを指します。
パソコンに限らず、スマートフォンやタブレットからもブラウザを閲覧する現代では、viewportを意識したページの見た目作りが重要となります

元記事を表示

Rails 直打ち禁止の方法 (URL入力で他人の編集画面へ遷移させない)

# 直打ち禁止ってなんだ
プログラミング歴が7ヶ月と、まだまだ右も左もわかりません。
課題をこなしてく中で、「*投稿者のみ*が編集や削除ができるように設定してください。」という条件がありました。
これを、 **直打ち禁止**というそうです(URLに**直接** https:///XXX/edit と**打ち込む**ことで他人の投稿を編集できちゃから、、、直打ち?)。

![スクリーンショット 2020-10-31 18.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664818/fbd6abe3-ee14-356b-698a-8e0227086e9a.png)

なるほどなぁ…と想いながら月日が経って、ポートフォリオを作成する時期になり、完成後に直打ちできちゃうことが判明。
うっかり忘れてしまっていたので、備忘録として直打ち禁止の方法を記録します。

ログインしていない状態だと、*「投稿者のみ」*という判断ができないので、ログイン機能がないアプリやホームページはどうやるんだろうか。それ

元記事を表示

デフォルト値付きの引数 Railsチュートリアルのfull_titleメソッドを例に

##対象者
・以下のRailsチュートリアル4章で出てくるfull_titleメソッドの引数(page_title = ”)に違和感がある方
・デフォルト値付き引数について理解していない方

“`
full_title(page_title = ”)
“`

・Railsチュートリアル、チェリー本で学習している方

## 記事の目的
Railsチュートリアル4章のfull_titleヘルパーメソッドの引数(page_title = ”)の部分について理解する。

初学者で勉強のアウトプットもかねてます。間違いがあれば、ご指摘下さい。

##Railsチュートリアル4章で出てくるfull_titleの引数である(page_title = ”)とは?

【リスト 4.2: full_titleヘルパーを定義する】

“`app/helpers/application_helper.rb
module ApplicationHelper
# ページごとの完全なタイトルを返します。
def full_title(page_title = ”)
base_titl

元記事を表示

【Rails】新規プロジェクトを立ち上げる

#はじめに
新規プロジェクトを立ち上げる時にバージョン指定等を行います。
全ての始まりなので丁寧に記録を残しておきます。

####目次
1.新規プロジェクトの立ち上げ
2.データベースを作成
3.GitHubと連携

#1. 新規プロジェクトの立ち上げ

tabiという名称のアプリケーションを作成します。

“`ターミナル.
% cd ~/projects
% rails _6.0.0_ new tabi -d mysql

#……読み込みをしばらく待って。
successfully が表示されれば成功。

% cd tabi
“`
新しくできたtabiアプリに移動します。

#2. データベースを作成
データベースを作成する前に、database.ymlに記載されているencodingの設定を変更します。

“`config/database.yml
efault: &default
adapter: mysql2
#encoding: utf8mb4 ←これをutf8に編集
encoding: utf8
pool: <%= ENV.fetch("

元記事を表示

Docker+VSCode(Remote Container)によるRuby on Railsの開発環境構築

# はじめに
諸事情により,Webアプリの開発を行うことになったので,DockerとVSCodeを使って,Ruby on Railsの開発環境を構築しました.備忘録として,その記録を残しておきたいと思います.
ちなみに,この方法で構築すると基本的にVSCode内で完結します.いちいちターミナルで,`docker-compose up`して`docker-compose run web rails db:create`と入力する必要はなく,VSCodeのターミナル上で`rails db:create`できます.

# VSCodeのRemote Container(Development)
今回はVSCodeの拡張機能であるRemote Containerを使います.このRemote Containerを使えば,なんとDockerで立ち上げたコンテナの環境にVSCodeでアクセスして,コンテナ内のプログラムファイルをVSCode上で編集やらデバッグやらを実行することができます.ちなみに,似たような拡張機能にRemote Developmentなるものがありますが,これはDockerのコン

元記事を表示

OTHERカテゴリの最新記事