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

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

既存の開発環境にDockerを導入する

### はじめに
今まではAWSのcloud9でrailsアプリを開発していましたが、実際の開発現場で使われているというDockerを開発環境に導入しようと思います。

※導入する際には、以下の記事を参考にさせていただきました。
[丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)](https://qiita.com/azul915/items/5b7063cbc80192343fc0)

### 環境
Ruby 2.5.3
Rails 5.2.4
MySQL 5.7
MacBook Pro

#### 1 自分のアプリのディレクトリ直下にDockerfileを作成する

“`php:Dockerfile
FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y vim nodejs default-mysql-client
COPY . /fishingshares
ENV APP_HOME /fishingshares
WORKD

元記事を表示

【Rails】 関連モデル先の条件で検索する方法(内部結合)

# 関連モデル先の条件で検索する方法
すでにたくさんの記事が出ていますが、自分がよく使うものを忘れないようにメモしました。

#

“`ruby
User.joins(:posts).includes(:posts).where(posts: { post_name: ‘test1’ })
“`

# 参考
* Rails における内部結合、外部結合まとめ
* https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30

元記事を表示

Rails の日付や時間の処理を読みやすく書く方法まとめ

Rails には Time 型、Date 型、Duration 型など時間に関わらる様々な型があり、その全てに様々なエイリアスが生えています。
様々なユースケースにおいて、日付演算が読みやすくなるように配慮された結果だと思いますが、時たま難解な組み合わせに出会うことがあります。極端な例ですが、`3.days.from_now(Time.current.yesterday)` などのような感じです。正直いつの時点を指しているのかパット見でよくわかりません。

実は読みやすさだけを考えた場合、選べる選択肢はそれほど多くありません。
その読みやすくなるパターンについてまとめてみたいと思います。

## シフトさせる時間や日数が具体的にわかっている場合

Duration 型に対して対象の日付を渡す方法が最も自然に読めると思います。
具体例としては、

“`ruby
3.days.from_now # 3日後
3.days.ago # 3日後
3.days.after(some_event) # some_event から3日後
3.days.before(some_event) # som

元記事を表示

Rails アプリで S3 の権限制御を外さずに署名付きURLの署名を省いてファイルアクセスする方法を調べた

## はじめに

Rails アプリを用いて、S3 の権限制御を外さずに署名付きURLを省いてアクセスする方法について調べたので、その方法をまとめておきます。

## 背景

S3 バケット内のファイルに権限制御を入れ、そのファイルに対してアクセスするとき、署名付きURLを用いることがあると思います。こんなURLですね。(クレデンシャルはマスクしています)

`https://example.s3-ap-northeast-1.amazonaws.com/foo/bar/piyo.txt/?X-Amz-Expires=-0000000000&X-Amz-Date=0000000000000000&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AAAAAAAAAAAAAAAAAAAA/00000000/ap-northeast-1/s3/aws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=0000000000000000000000000000000000000000000000

元記事を表示

GitHubへpushした後、テーブルを統合して不要になった方のモデルを「rails d(estroy) model」で削除してはいけません。

## はじめに
チームでアプリケーション開発をしていて、データベースを設計をしていくと
GitHubにpushしたマイグレーションファイルの取り扱いについていろいろと~~振り回され~~
学ぶことが多いと思います。
そのときに参考にさせていただいたのが、こちらの記事でした。
[GitHubにpushしたmigrationファイルは安易に修正してはいけません](https://qiita.com/jnchito/items/3525fd22973477b88411)

本記事は、テーブルを統合することによって不要になったモデルファイルを消すときのお話です。

## 2つのテーブルを1つに統合することになった

開発を進めていくと、2つのテーブルを1つに統合することがありますよね。

AとBの2つをAに統合して、Bが不要になったとします。

Bテーブルを削除するには、新たにdropするマイグレーションファイルを追加するとして、
Bモデルを削除するには、消し漏れを防ごうとして、「rails d(estroy) model B」を実行したくなりますが、**やってはいけません。**

## なぜ?

元記事を表示

ancestryとjQueryで多階層型カテゴリの入力フォームを段階的に表示させてみた。

##何をしたか
ショッピングサイトの検索・購入ページなどでよく見かける
「多階層型カテゴリの入力フォームが順に表示される機能」を
ancestryとjQueryを使って実装してみました。
振り返りを兼ねて記事を書いていきます。

##下準備

長いので見たい人だけ展開してください

※コードは載せますがここでは特に説明しません。
※scssは必要ないのですが味気ないので入れました。

“`terminal.
$ rails _5.2.4_ new ancestry_sample –database=mysql –skip-test –skip-turbolinks –skip-bundle
$ gem install ancestry jquery-rails haml-rails
$ bundle install
$ rails g model category
$ rails g model item
$ rails g controller categories
$ rails g controller i

元記事を表示

『メッセージを投稿』できる最低限のRailsアプリを丁寧に作る(これで初心者完全卒業!)

# この記事の基本的な方針
メッセージを投稿して一覧表示するだけの簡単なアプリを作ります。
完成するのは以下のたった4画面のアプリです。

【TOP画面(ログイン前)】     【TOP画面(ログイン後)】
a0.png a4.png
【登録画面】
a1.png【Rails】 5分でApexChart.jsを導入する方法

# はじめに
Apexchart を Rails に導入してみたのですが、かなり使いやすいわりに日本語記事がなく浸透していないと感じたため普及活動として広めていけたらいいなと思います。

# ApexChart.js とは
グラフ描画のライブラリです。同じようなライブラリの1つにchart.jsなどがあります。

* https://apexcharts.com/javascript-chart-demos/

## コマンド

“`terminal
// Rails アプリケーション作成
$ rails _5.2.4_ new five_min_apexchart
$ cd five_min_apexchart

// scaffold で Event モデルを作成
$ rails g scaffold c

元記事を表示

Rubocopについて

Rubocopとはなんぞや。
まあ、端的に言えば「汚いコードを指摘してくれる」gem。ruby限定ですけど。
ポートフォリオを作っている時、ふわふわと「最後の仕上げに入れればいっか」なんてふざけたことを考えていました。完成した今だから言う。

**バカかお前は!!!!!**

普段わたしはコーディングする際、めちゃくちゃ綺麗に書くことを意識して書いています。もうほぼ完成って段になってRubocopを通すとあら不思議!クソコードが大量に発見されました!ボコボコにされて泣きながら書き直しましたよ、ええ。
とにかくRubocopは、コードを書いた都度調整するのに最適だと思っています。
やり方は以下。

“`Gemfile.
gem ‘rubocop’, require: false
“`
bundle installでインストールして完了。

“`
$rubocop
“`
これでrubyの規定に沿わないものが出てきます。
しかしこれだけではrailsアプリ内のファイル全てが対象になります。泣きます。
なので対象を絞ります。
アプリ直下(Gemfileなどと同じ場所)に
「.rubo

元記事を表示

Vagrantを使う「Mac最速のDocker環境」を初心者向けに解説

下記の記事を参考にVB上にDocker環境を構築してみたのですが、いくつか調べて対応しなければいけなく、初心者にとってはとっつきにくいかと思いました。

参考: [DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる](https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484)

初心者向けで細かくコマンドを解説していきたいと思います。

間違えている部分がありましたらガンガンFBお願いします!

## 対象者
* Mac
* Homebrew導入済み
* Dockerの使い方がわかる
* Docker上でRails開発をしていて、重いなって感じてる人

## 導入方法

### VirtualBoxのインストール

[VirtualBox](https://www.virtualbox.org/)をbrew caskを使ってインストールします。

“`bash:
brew cask install virtualbox
“`

インストール開始時にパスワード入力を求められるので、

元記事を表示

本番環境でデータベースが更新されない

### 追加したカラムが本番環境で反映されない…

`チーム開発デプロイ担当として苦労したエラーの解決方法になります。`

開発環境でデータベースに新しいカラムを追加しても
本番環境(EC2)へデプロイしても反映されない(泣)

本番環境でデータベースをマイグレートしてみよう!
これで反映されるだろ!

“`:ターミナル
rake db:migrate RAILS_ENV=production
“`
だが、
コマンドを実行しても反映されない…
どうやって追加した状態の新しいデータベースにするんだ..
と一日悩みました。

####ここで必殺技を伝授させ頂きました!

###本番環境にてもう一度データベースを再生成する!
“`:ターミナル
$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

$ rails db:create RAILS_ENV=production

$ rails db:migrate RAILS_ENV=product

元記事を表示

N+1問題とは?

#はじめに

よく耳にするけど「N+1問題」っていったい何??
どうすれば対処できるの??
となったのでまとめてメモ。

#N+1問題って?

N+1問題とは、SQLが必要以上に発行されてしまい、パフォーマンスが低下してしまう問題のこと。
??????

##つまりどういうこと??

例えば、
UserモデルとMicropostモデルがあり、
Userが複数のMicropostを持っているとします。

“`app/models/user.rb
class User
has_many :microposts
end
“`
“`app/models/micropost.rb
class Post
belongs_to :user
end
“`
そしてMicropost一覧ページでuserを表示するとします。

“`app/controllers/micropost_controller.rb
class MicropostsController < ApplicationController def index @microposts = Micropost.al

元記事を表示

【Rails】pluralize

#pluralizeヘルパー
英語専用のテキストヘルパー。
最初の引数に整数があると、それに基づいて2番目の引数である英単語が複数形に変化したものが渡される。

##サンプルコード

“`
>> pluralize(2, “woman”)
=> “2 women”
>> pluralize(3, “erratum”)
=> “3 errata”
“`

##実施例

“`rb
<%= pluralize(@user.errors.count, "error") %>
“`
このコードだと”0 errors”、”1 error”、”2 errors”などのように、エラーの数によって活用される単語が変わってきます。”1 errors” のような英語の文法に合わない文字列を避けることができます

元記事を表示

[Rails5]Twitter認証で悩んだことまとめ

## 概要
TwitterAPIを利用してすでにある認証機構に後付けでTwitterログインをつける際につまづいたことをまとめます。
自己流の解決方法なので最適ではない可能性が高いです。ご意見いただたら嬉しいです。
developerアカウントとか外部キーの取得に関しては記事がたくさんあるので省きます。

**※Deviceなどの認証系のgemは使っていません。**

記事を参考にして作ったモデルのメソッドはこんな感じ↓

“`ruby:/app/models/user.rb
def self.find_or_create_from_auth(auth)
provider = auth[:provider]
uid = auth[:uid]
name = auth[:info][:name]
image = auth[:info][:image]

self.find_or_create_by(provider: provider, uid: uid) do |user|
user.name = name
user.email = User.dum

元記事を表示

【Rails】【初学者向け】Bootstrapてなんだ(一番簡単にRailsアプリにBootstrapを導入する)

# Bootstrapてなんだ
目次
・Bootstrapとは
・Bootstrapの利用方法
・BootstrapをRailsアプリに導入するまで

ちゃっちゃとRailsアプリに導入したい方は、
・BootstrapをRailsアプリに導入するまで
まで飛んでみてください!

## Bootstrapとは
Bootstrapは端的に言えば、**アプリのデザインを爆速で進めていくのにめちゃめちゃ便利なツール**、です!
元々、Twitter社が開発したものです。
普通一般に、デザインなどはプログラマーがCSSやJavascriptを書いていって、実装していくのですが、
Bootstrapを用いれば、もうすでにBootstrap側で作ってくれているCSSやJavascriptを用いることができるのです!
(つまり、みなさんがHTMLを書いていく中でクラス名を、Bootstrap側で用意してくれているクラス名に合わせれば、Bootstraps製のCSSやJavascriptが適用されるのです!)
そして、どのクラス名に合わせれば、Bootstrapが適用できるのか、に関しては
[Boot

元記事を表示

nokogiriのエラーでbundle installが出来ない。libxsltのインストールで解決

# nokogiriのインストールでエラー

`bundle install –path vendor/bundle/` するとnokogiriのインストールでエラー。

“`
An error occurred while installing nokogiri (1.6.7.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v ‘1.6.7.1’ –source ‘https://rubygems.org/’` succeeds before bundling.
“`
指示通りに`gem install nokogiri -v ‘1.6.7.1’ –source ‘https://rubygems.org/’`してみても状況は変わらず。

# gem_make.out確認
`gem_make.out`にResultがあると書かれてあるので見てみる。↓

“`
$ cat ./vendor/bundle/ruby/2.2.0/extensions/x86_64-linux/2.

元記事を表示

Ruby on Railsで環境変数を設定する方法

## はじめに
railsで環境変数を導入する方法をまとめました。
環境変数はAWSのAccessKeyなどの機密情報をGithubに上げずにアプリで使用する際に必要になります。
Githubに機密情報をpushすると、悪用される危険性があるので、環境変数を使いこなし、AccessKeyなどの機密情報を適切に管理できるようになりましょう。

### 1 gemをインストールする。
“`php:Gemfile
gem ‘dotenv-rails’
“`

### 2 .envファイルを作成
環境変数を設定したいアプリケーションのGemfileなどが置いてあるルートディレクトリに .env ファイルを作成します。

“`php:|.env|
AWS_ACCESS_KEY=’***********’
API_KEY=’*********’
DATABASE_PASSWORD=’**********’
“`

### 3 .gitigonreに.envを追加
.gitignoreファイルの中に.envファイルを記述しないと、Githubにpushしたときに、.envファイルも

元記事を表示

Rubyによるデザインパターン(1)

# Rubyによるデザインパターン(1)
 本記事は初級エンジニアがRubyを使用したデザインパターンをアウトプットしたものになります。また、デザインパターンは種類が多いため、何回かに分けて掲載していきたいと思います。今回はIteratorパターンとAdapterパターンをご紹介します。なお、こちら記事は次のサイトを参考にしております。
[TECHSCORE](https://www.techscore.com/)
[酒と涙とRubyとRailsと](https://morizyun.github.io/)

## Iteratorパターン
 Iteratorパターンは要素(オブジェクト)の集まりを保有するオブジェクトの各要素(オブジェクト)に順番にアクセスする方法を提供するデザインパターンです。各オブジェクトの名前、または各オブジェクトのパラメータを利用するなど、各オブジェクトへのアクセス方法は異なります。つまり走査方法(アクセス方法)を与えるクラスを別に用意することで、より柔軟な設計をする事ができるようになります。
 イテレータには内部イテレータと外部イテレータがありますが、内部イ

元記事を表示

Docker ComposeでRails+PostgreSQLの環境構築

docker-composeの勉強に,Railsの環境構築をやってみたのでハマったところも含めてメモ.
参考: [Quickstart: Compose and Rails](https://docs.docker.com/compose/rails/)

# 実行環境

– MacBook Pro (13-inch, 2019)
– macOS Catalina version 10.15
– Docker version 19.03.5
– docker-compose version 1.24.1
– ruby 2.5.7
– Rails 5.2.4.1
– postgres (PostgreSQL) 12.2

# 構築手順

## Dockerfileの作成

参考ページそのままに,`Dockerfile`を作成.

“`Dockerfile:Dockerfile
FROM ruby:2.5

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

RUN mkdir /myapp
WO

元記事を表示

Action Cable 本番使用時のNginxとCable.ymlの設定

##はじめに

Action CableはWebSocket通信技術を用い、リアルタイムなチャットなどの機能を実装できる機能です。
AWS本番環境でのNginxとCable.ymlの設定に関して詰まった箇所を共有します。

![chat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481058/2bae78db-49d1-fe42-804d-252e0ba769f5.gif)

##前提
– Rails 5.2.3
– Puma
– Nginx
– AWSでデプロイ
– **Https通信**

ローカルではWebsocket通信が正常に動いていることが前提です。

##Nginxの設定追加
**最後の一行ですが、Httpsの場合はこれがないとコンソール内に403エラーになるので注意してください。**

proxy_set_header X-Forwarded-Proto https;

“`nginx:/etc/nginx/conf.d/app_name.conf
location /c

元記事を表示

OTHERカテゴリの最新記事