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

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

RailsにバッチAPI導入してみた

# バッチAPI

## バッチAPIの目的

– システムによって、バッチAPIの目的が違います
– 非同期の処理のエンドポイント
– Gitlabバックアップ
– Twitter API
– 複数リクエスをまとめるエンドポイント
– [Facebook API](https://developers.facebook.com/docs/graph-api/making-multiple-requests/)
– [Microsoft API](https://docs.microsoft.com/en-us/graph/json-batching)
– [Google API](https://developers.google.com/gmail/api/guides/batch)

## 非同期の処理のエンドポイント

– リクエストして、返すのはデーターじゃなくJobID
– その後に、Jobの状態を収得して、成功であれば、データーが取れます。
– [Twitt

元記事を表示

【f.attachment_filed】 gem refile 使用時 画像送信ボタン CSS 変更

#【ゴール】
gemfile ‘refile’ 使用時の画像送信ボタンのレイアウトを変更

#【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

#【実装】
アプリケーション内のGemfile内に以下を記述

“`アプリケーション内.Gemfile
#refileをインストール
gem “refile”, require: “refile/rails”, github: ‘manfe/refile’
gem “refile-mini_magick”

#jqueryをインストール
gem ‘bootstrap-sass’, ‘~> 3.3.6’
gem ‘jquery-rails’
“`

gemfileを対象アプリへ認識させます

“`Mac内.terminal
$ bundle install
“`

お好きなviewページで以下を入力(これが画像を送信するボタン)

“`(お好きな.view)

元記事を表示

【boolean型】 viewへの反映、選択機能 実装  

#【ゴール】
boolean型を使用してviewファイルへ反映させる
参考にしたサイト:http://banker0507.blogspot.com/2012/07/booleantruefalse.html

#【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

#【実装】

アプリケーションを起動

※新規アプリケーション作成については、[【Rails new】Ruby on rails アプリケーション作成](https://qiita.com/tanaka-yu3/items/3fe1ed2852c6513d3583 )を参照。

“`Mac内.terminal
rais g migration Add(データを追加したいデータファイル名)To(追加したいデータ)
“`

“`add.migartionファイル
add_column :(データを追加したいデータファイル名) , :sex ,:boolean
end
“`

“`Mac内.ter

元記事を表示

【Rails】enumの使い方

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# boolean型

**Userモデルの「is_valid」というカラムに、
“有効”と”無効” を定義したいという想定で進めます。**

###1.`enum`をモデルに定義

“`ruby:~.rb
enum is_valid: { “有効”: true, “無効”: false }
“`

###2.ビューでの使い方

####**①プルダウンメニューで使用する場合**

“`erb:~.html.erb
<%= f.select :is_valid, User.is_valids.keys, include_blank: "-----" %>
“`

`<%= f.select :カラム名, モデル.カラムの複数形.enumのkey又はvalueの複数形 %>`

####**②ラジオボタンで使用する場合**

“`erb:~.html.erb
<%= f.radio_button :is

元記事を表示

【Rubyバージョン変更】Docker環境でrbenv, ruby-buildをインストールする

## はじめに
 Dockerで開発していく中でrubyのバージョン変更する必要が出て来たのでrbenv, ruby-buildをインストールしてrubyのバージョン変更を行う

### rbenvをインストール
/bin/bashでrbenvをcloneしてくる

“`bash

git clone https://github.com/rbenv/rbenv.git
“`
パスを通す

“`bash

echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bash_profile
echo ‘eval “$(rbenv init -)”‘ >> ~/.bash_profile
source ~/.bash_profile
“`

### ruby-buildをインストール
ruby-buildをcloneする

“`bash

git clone https://github.com/rbenv/ruby-build.git
“`

### rubyインストール
バージョン確認してrubyをインストールする

“`
rbe

元記事を表示

deviseのconfirmable機能において、メール認証後にログイン状態にする方法

#前提条件
devise gem(ver.4.7.1)を用いて以下を完了していることが前提となります。

✅基本的なユーザーログイン機能を実装していること
✅confirmable機能を用いて、以下のようにメール認証機能を実装していること。
1. 新規登録画面で新規登録情報(アドレス、パスワード2回)を入力する
2. 1.で入力したアドレスにページリンク付きアカウント確認メールが送信される
3. 2のリンクからログイン画面に転送される (新規登録完了)
4. ログイン画面でアドレス、パスワードを入力する
5. ログイン完了し、ホーム画面にジャンプする
# 実現したいこと
確認メールのリンクをクリックすると登録完了はもちろん、自動でログイン状態になるようにしたい。(上記の動作で言うと、4.をスキップするイメージ)

# 方法
confirmations_controllerに以下を追記する。

“`ruby:users/confirmations_controller.rb
..
private
def after_confirmation_path_for(resource_n

元記事を表示

[図解] 誰でもわかる N+1問題 ActiveRecode

#図解 N+1問題
今回はN+1問題について、図解で説明していきたいと思います。
Ruby on Railsで使われているORMであるActiveRecordを題材に解説をしていきます。

#N+1問題とは?
簡単に説明をすると、

**ループ処理等によって繰り返し、
SQLが発行されてしまう問題のことをN+1問題と言います。**

図を見た方が理解がしやすいと思います。

今回の例では、
Client と Address 互いに関連付けのある2テーブルがあると仮定して話を進めて行きます。
下記の図では、各Clientが持つAddressテーブルのpostcodeを取得しようとしています。

![N+1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354877/a2fa1c04-0590-63fd-1824-aca728a3f3f0.png)

“`
clients = Client.all
“`

画像の最初の行の、
Client.allでは以下のような問い合わせを行っています。
この問い合

元記事を表示

Railsで gem install mysql2 でなかなかうまくいかない件

この記事では RailsでGemを入れる時に`mysql2`がやっかいで入らないのを解決する記事です。
同様の記事はかなりたくさんあるのですが、2020/04/28現在、全部やってもうまくいかなくてGithubのissueとStackOverFlowでなんとかいったのでその紹介です。
mysql5.7や8.0使いたいのに5.6に戻す系は自分的には目的に沿ってないのであくまでもポジティブに攻めてます。(いつも)

# エラー

“`
ld: library not found for -lssl
“`

特に解決につながった参考記事

– https://github.com/brianmario/mysql2/issues/795
– https://stackoverflow.com/questions/57047085/ld-library-not-found-for-lssl-while-installing-mysql2-gem

# やったこと 1 `xcode-select –install`

そもそも、人によってうまくいくパターンが異なるのは、それぞれの環境で

元記事を表示

日時を日本時間で表示する

## 目的
アプリ内で作成したレコードを表示させる際に、デフォルトのUTC(協定世界時)からJST(日本標準時)に変更し表示させる。

### 準備
事前にアプリケーションの基本的な機能が実装されているものとして話を進めます。
まずユーザーでもなんでもいいので、テーブルにレコードを作成します。
Sequel ProなどのGUIツールで確認すると、`created_atカラム`に日本時間よりも約9時間遅い時間で作成されたことになっているはずです。ここから日本時間で表示する設定をしていきます。

### 手順
`config/application.rb`に以下の記述をします。

“`Ruby:config/application.rb
# 省略

class Application < Rails::Application config.time_zone = 'Tokyo' end ``` アプリを立ち上げた段階で既にコードが用意されているので、その中から`class Application`を探し、その中にタイムゾーンの記述をします。 この後、必ずサーバを再起動してから

元記事を表示

Railsで簡単なレベル機能

#Railsで簡単なレベル機能を作ってみた

今回はこれまで作ってきたSNSサービスにレベル機能を追加しました。
簡易的なものなのであくまで参考程度にして頂ければと思います。

<開発環境>
1. ruby 2.6.3
2. Rails 5.1.6
3. AWS Cloud9
4. GitHub
6. sqlite3(develop環境)

## 設計構想
・一定の経験値(exp)を貯めるとレベルが上がっていく機能。

・投稿と紐づけて自分の食べたラーメンの種類によって得られる経験値が変わる
→postテーブルにexpカラムを設置して投稿するとexpが得られる、postテーブルのuser_idと紐づけてexpの合計値を出す。expの合計値によってレベルに反映されていく。

・userにpostで得られたexpの合計(exp_sum)がlevelとして表示される。

## モデル
今回用意するのはpostテーブルにexp(経験値)カラム、userテーブルに経験値の合計であるexp_sumカラム、levelカラムの三つです。

“`
rails g migration add_exp_t

元記事を表示

[Rails]vagrant 共有フォルダが共有できない & Encoding::UndefinedConversionError


Railsの初心者の備忘録です。

#初めに

Railsでvagrantの立ち上げから行ったら、今まで作成したファイルがteratermから見れなくなってしまいました。
反対にteratermでrails newしたものがエクスプローラーから見れない、、、
そのため、共有フォルダがおかしいのかと思ったのですが、対処法が分からなかったので、ここにメモしておきます。

#基本情報
・windows
・VirtualBoxでPC上に仮想環境を構築
・Vagrantで仮想環境を操作
・作成した仮想環境にSSH接続

#エラー内容
下記のように、本来ならteratermでworkディレクトリ内には、エクスプローラーのvagrantディレクトリの中にあるものが表示されなければいけないのですが、表示できていません。
また、teratermでrails newした“`otameshi“`と“`test.app“`というフォルダがエクスプローラーに反映されていません。
→共有フォルダがおかしい

(※エクスプローラーのファイル名は一部隠しています)

![スクリーンショット (245)

allow_any_instance_ofの使い方

#### 注意※`allow_any_instance_of`はあまり使うことを推奨されていません

僕はrailsでAPIを作成し、コントローラーの中で外部のAPIを叩いていたので、

毎度テストのたびに外部APIを叩くのはあまり良くないと思い、

`allow_any_instance_of`を使い外部APIの期待する戻り値を設定しました。

“`ruby

allow_any_instance_of(クラス名).to receive(メソッド名).and_return(期待する戻り値)
“`

これは自分用の備忘録として記載しています。

ECサイト 商品ランキング機能 実装方法

商品の購入された回数に応じてランキングを表示する方法。

## 前提
・ECサイトの製作
・商品のテーブルをitemとしている
・注文された商品をOrderItemとしている

## コントローラー

“`controller.rb
def index
@rank_items = OrderItem.find(OrderItem.group(:item_id).order(‘count(quantity) desc’).limit(3).pluck(:id))
end
“`

“`@rank_itemsの詳細説明.rb

OrderItem.group(:item_id) #OrderItemのitem_idが同じものをグループに分ける。
.order(‘count(quantity) desc’) #ここでのorderは順に並べるという意味。descが大きい順にという意味。
.limit(3) #表示する最大数を3個に指定。
.pluck(:id)) #idを取り出す。

OrderItem.find() #pluckで取り出された数字をOrderItemのIDとす

【Rails】sorceryのログイン機能を実装

[sorcery公式](https://github.com/Sorcery/sorcery)
[sorceryメソッド](https://github.com/Sorcery/sorcery/blob/7c5fee441e03779ee2888ecef317440cd10a17e7/lib/sorcery/controller.rb#L76-L78)

## sorceryのインストール

“`ruby:Gemfile
gem ‘sorcery’
“`

## Userモデルを作成する
– `bundle exec rails g sorcery:install`を実行すると、以下のファイルが作成されるので、`db:migrate`する。
– migrationファイル(db/migrate/〇〇〇〇_sorcery_core.rb)
– initializerファイル(config/initializers/sorcery.rb)
– Userモデル

“`ruby:db/migrate/〇〇〇〇_sorcery_core.rb
class SorceryCore <

【Rails】kaminariを使用してページネーション機能を実装

## ページネーションとは
投稿一覧ページなどを複数のページに分割して表示させること。
トップページで全ての投稿を表示させると、データの読み込みに時間がかかるので、ページネーションを使う。

## kaminariとは

ページネーションを簡単に実装するためのgem。
[kaminari](https://github.com/kaminari/kaminari)

Gemfileに以下のように記述して、`bundle install`を実行すると準備完了。

“`ruby:Gemfile
gem ‘kaminari’
“`

“`ruby
$ bundle install
“`

## 設定ファイルをカスタマイズする

kaminariの設定ファイルを作成

“`terminal
$ rails g kaminari:config
create config/initializers/kaminari_config.rb
“`

上記コマンドにより、config/initializers ディレクトリ直下に、以下の設定ファイルが生成される。

“`ru

アプリ制作に必須なRailsの起動方法

# Railsはめちゃくちゃ便利!
アプリに必要な機能の雛形を事前に全て用意してくれています。
雛形に手を加えるだけでお洒落な投稿アプリを作ることだってできます。
今回はその起動方法について記していきます。

# 早速起動してみよう
環境は5.2.3
そしてオプションにmysqlを利用しています。
mysqlについては後日記載していきます。
ターミナルで以下のように記述しましょう。
`ターミナル`

“`terminal
% cd project(他の場所でも構いません)
% rails _5.2.3_ new “practiceApp(ここにはアプリの名前が入りますので自由な名前を付けてもらえれば大丈夫です)” -d mysql
% cd アプリ名
“`
これができたらデータベースも作りましょう。

データベースとは

ユーザーの名前やメールアドレスなどを登録する場所です。**データを保管してある場所という認識で構いません。**

`ターミナル`

“`terminal
% rails db:create
#

【Rails】RSpecを用いてテストを書くために準備する事

##はじめに
「[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%8F%BE%E5%A0%B4Rails&qid=1586706956&sr=8-2)」にて紹介されていた、RSpecでテストを記述していくための必要事項を備忘録的にまとめました。

※環境Rails5.1以降

##RSpecではシステムテストを使用することにする
####システムテスト(System Test)とは
  ・E2E(End-t

CircleCIでdocker-composeを使用して自動テストしてみた

#はじめに
今回は、CircleCi上でdocker-composeを使用して自動テストを導入してみました。CircleCi上ではRSpecのテストを行っています。ローカルのテスト環境用ocker-compose.ymlをそのまま使用しているので比較的簡単にCircleCiを導入できました。何かの参考になればと思い記事にしてみました。
尚、開発環境とテスト環境用の設定については以前記事にしているこちらを使用しています。
[DockerでNginx+unicorn+rails+Mysqlの開発環境を作ってみた](https://qiita.com/E6YOteYPzmFGfOD/items/509dbabeb20bf2487283)
[Docker+Rails+HeadlessChromeでRSpecのSystem Testしてみた](https://qiita.com/E6YOteYPzmFGfOD/items/905cce063b0d21a0eccb)

###参考にさせていただいた記事
[docker-composeでRailsを開発しCircleCI 2.0でテストしてHerok

悲観的バージョン演算子(~>)とは何か?

# 悲観的バージョン演算子(~>)
Rubyでの開発を行っていると一度は出会う **悲観的バージョン演算子(~>)(Pessimistic Operator)**。Gemfileで例えば**~>0.7.7**などと記述されているのを見て、初めての方だと混乱される方も多いだろうし、少し慣れている方でもついググってしまう方もおられるかもしれない。そこでここでは初めての方には一先ず理解してもらうべく、初見ではない方にはもうググらなくて済むことを願って解説していければと思います。

## x.x.xの例
x.x.xの形式でバージョン指定が行われている場合、例えば下記の様にGemfileが記述されている場合を考えてみる。
“`gem ‘rails’, ‘~>4.2.6’“`
これは結論から言うと“`4.2.6 <= 'rails' < 4.3```となる。 ではどの様に考えれば、この結論に至るのかを順を追って説明したい。 ### まずは最小値である下限から考えてみる 上記の例を使用するとこの場合の下限は**4.2.6**となることが分かる。これでまずは下限が決まった。簡単。 ###

if railsリファクター

# ifにまつわるリファクター
もうちょっといい感じになるでしょ・・・!でも書き方がわからないなんてときのTips

### 条件と代入したいものが同じ!

“`
rate = if point
point
else
20
end
“`

“`
rate = point_usable_limit_rate || 20
“`

### ifが二重ネストしているが、最初のifの結果と中のifが同じ場合

“`
if CCCC
if DDDD
AAAA
else
BBBB
end
BBBB
end
“`

“`
unless CCCC? # 最初にCCCC以外を弾く
if DDDD
AAAAA
end
BBBB
end
“`

### 同じカラムを見に行くが値が違う時

“`
if AAA.type == “MAYO” || AAA.type == “BUTTER”
“MAYOBUTTER”
end
“`

“`
if AAA.type.in?([“MAYO”, “BU