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

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

【Rails】authenticateメソッドが返すもの

#はじめに
モデルのテストを書いているときに、authenticateメソッドの検証で少しつまづきました。
簡単な内容ですがエラーの理由・対策を記載します。

#authenticateメソッド
has_secure_passwordメソッドをユーザーモデルで呼び出すだけで使えるようになるメソッド。
パスワードを引数としてユーザーの認証を行うことができる。

#ユーザーモデルのテスト(RSpec)
まずは誤ったパスワードを入力した場合のテスト。
(FactoryBotではパスワードを”password”と設定)

“`
(略)
context ‘正しくないパスワードの場合’ do
it ‘認証がされない’ do
expect(user.authenticate(“invalid_password”)).to eq(false)
end
end
(略)
“`
問題なく通過。

次に、正しいパスワードを入力した場合のテスト。

“`
(略)
context ‘正しいパスワードの場合’ do
it ‘正常に認証される’ do

元記事を表示

PostgreSQL DB のアップグレードは brew postgresql-upgrade-database が便利

Homebrew で PostgreSQL をインストールしていると、`brew update && brew upgrade` を実行してアップデートした際、PostgreSQL もアップデートされ、バージョンの不一致によって動かなくなることがあります。

## Rails のエラー例: `PG::ConnectionBad`

![Rails – PG::ConnectionBad](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857/81751166-ebcb-e2bb-b8f1-a6e3a3b0f6db.png “Kobito.zFAY7M.png”)

上記エラーメッセージを見ると「PG (PostgreSQL) 周りの影響かな…? ??」と推測できるので、実際に PostgreSQL コマンドを実行してみると、PostgreSQL のーアップデートには個別に対応する必要があることが分かります ?✨

“`bash
╭─○ yasulab ‹2.6.5› ~/coderdojo.jp
╰─

元記事を表示

ActiveAdmin の各パーツのカスタマイズ方法がドキュメントのどこに載っているのかざっくり調べた

## はじめに

最近 [ActiveAdmin](https://activeadmin.info/index.html) について、ドキュメントを読みながらカスタマイズを試しているのですが、画面の各パーツがドキュメントでどこを指しているのかがわかりづらかったので、備忘で整理しておきます。

## ざっくり全体感を掴むには

[ActiveAdminのドキュメントのトップページ](https://activeadmin.info/index.html) にのっている説明画像をまず見るとイメージがつきやすかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222030/569f6085-0963-ec78-ab0c-d6be80632291.png)

## 各パーツについて

ActiveAdmin が用意しているデモ画面を参考にします。

http://demo.activeadmin.info/admin/users

### Global Navigation

ヘッダ

元記事を表示

rails sが起動しない rails5.2.2

rails 5.2.2をインストールしたときのエラー

“`
Please check your Rails app for ‘config.i18n.fallbacks = true’.
If you’re using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be 'config.i18n.fallbacks = [I18n.default_locale]'. If not, fallbacks will be broken in your app by I18n 1.1.x. ``` 警告文の第2段落によると、 I18n(>= 1.1.0) かつ Rails (< 5.2.2) において fallback 機能を有効にしたい場合、 または、 警告文の第3段落で紹介されているgithubのページによると、 I18n 1.1.x 系において fallback 機能を有効にしたい場合、 ```/config/environments/production.rb config.i18n.fallbacks = [I18n

元記事を表示

【備忘録】docker環境でrails開発 dbconsole編

2020/02/28
docker×railsでmysqlを使って開発しています。
table同士を外部キーで紐付けしたく、modelとmigrationファイルを作ったところ、作る際に紐付け先のtable名を間違えていました。
ただマイグレーション実行前にmigrationファイルとmodelの中身を編集し直したので結果、大丈夫だったのですがしっかり作れているか不安だった為、テーブルの中身を確認したいと思いました。

railsではrails dbconsoleというコマンドライン上からデータベースの中身の確認や編集をすることができるコマンド(らしい)があります。
今回それをつかって確認しようと思いましたが上記コマンドを実行しようとするとエラーになりました。
調べていくとdockerfileが原因らしく、以下の記事を参考にdockerfileを編集したらうまくいくようになりました。
https://qiita.com/ryosk7/items/077ea98a88ec3df289c8
一応、動くようにはなったのですが、dockerのイメージやらコンテナやら用語がイマイチ難しくてわかっ

元記事を表示

【Rails】Rails6系とMySQL8系の組み合わせの開発環境をDockerだけでつくる

# 概要

– :point_right: この記事は弊社ァ内で行った準備作業の備忘録メモでございますわっ
– 次の新規案件に備え、RubyとRails最新版のスケルトン(?)なプロジェクトを準備する
– 各バージョンは以下の予定
– Ruby2.7系
– Rails6.0系
– MySQL8.0系
– Nginx1.17系
– redis(いちおう)
– Docker前提です
– 新規ならDockerでしょ?って、僕も過激派になっている感。
– AWS ECSでの運用が前提のため。
– Rubyのイメージは**alpine3.11**を使用。**カーネル5.4系でセキュリティも向上してる**らしい(?)し、**軽い**し[^1]、

“` shell
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ruby

元記事を表示

Capistranoでのデプロイを攻略する

# 今日の目標 
デプロイ作業でよく使うコマンドを整理する

# 前提 
Rails 5.0.7.2
レポジトリ名:freemarket
pemキー名:team_c.pem
ユーザー名:ec2-user
Elastic IP:@18.176.134.115

# SSH接続
“`
$ cd .ssh/
$ ssh -i team_c.pem ec2-user@18.176.134.115
cd /var/www/freemarket
“`
# pemキー確認

“`
cd
cd .ssh
ls
“`
# デプロイコマンド
“`
bundle exec cap production deploy
“`
#AWSアクセスキー、キーID確認

“`
env | grep AWS_SECRET_ACCESS_KEY
env | grep AWS_ACCESS_KEY_ID
“`
# MySQL
“`:ターミナル(本番環境)
状況確認
sudo service mysqld status
起動する
sudo service mysqld start

mysqlにアクセスする

元記事を表示

deviseの関連ファイルが作られず、コマンドが適用されなくなった時の対処法

deviseをインストールしていると`config/initializers/devise.rb`と
`config/locales/devise.en.yml`ファイルが生成されておらず、、さらに`rails g devise user`や`rails db:migrate:status`しても

“`bash
NoMethodError: undefined method `devise’ for Install (call ‘Install.connection’ to establish a connection):Class
“`
というエラーが出ました。すでにuserモデル以外のデータべースは作ってあるので`rails db:migrate:status`が出来ないということはコマンドが適用されていないということだと思います。
同じ状態で`bundle install`からやり直しても解決出来ませんでした。

## 考えた仮説
このときGemfileにはちゃんと`gem ‘devise’`と記述されていました。ターミナル履歴は以下の通りです。

“`bash

元記事を表示

【Rails】入力された値を元にGETリクエストを送ってjsonを取得し、DBに保存する

## すること

今回は[GET statuses/oembed — Twitter Developers](https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/get-statuses-oembed)を用いてツイッターカードを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322882/9e230f72-496a-0487-e967-4d3dba1030ef.png)
流れは以下の通りです。

1. 入力されたURLからIDを取得
2. リクエストを送信
2. データを取得
2. URL, jsonをデータベースに保存
3. 保存したデータを表示

### 開発環境

Ruby 2.6.5
Rails 5.2.3
MySQL 8.0.19

## 実装する

### モデル

事前に、jsonを入れる予定の`t_json`カラムをマイグレーションで作成しておきます。

“`

元記事を表示

【Rails】依存関係にあるGemのバージョンコンフリクト「Bundler could not find compatible versions」

#概要
依存関係にあるgemのバージョン問題を解決する。
今回は以下2点のgemにおいて発生したエラーの解決までの流れになります。

`omniauth-google-oauth2`
https://github.com/zquestz/omniauth-google-oauth2

`rspotify`
https://github.com/guilhermesad/rspotify

#エラー発生
`omniauth-google-oauth2`を利用してGoogleSNS認証を実装し、
ログインが完了した後にアプリ内のとあるviewで以下のエラーが発生するようになってしまいました。

エラーメッセージ「key not found: :ciphers」

“`ruby

require ‘rspotify’
RSpotify.authenticate(ENV[‘SPOTIFY_CLIENT_ID’], ENV[‘SPOTIFY_SECRET_ID’])

“`

SpotifyAPIを利用するために取得していたkeyが見つからないとのこと。
Google認証機能を加え

元記事を表示

rubyXLでexcelデータを出力する際に悩んだこと。

備忘録な意味合いで残します。

**1. テンプレートとするExcelで完全にブランクなセルに値をセットしようとするとエラーになる。**
・罫線などの情報を一切もっていないセルには、
  **file[sheet_name][row][col].change_contents(value)**
 こういう指定ができない。
 もしこれで、nil:NilClassのエラーがでるようなら、該当のセルにスペースを一度いれておく。とかで取得できるみたい。

**2. insert_rowで値を挿入すると、その下のセル結合などが壊れる。**
・仕様のようなので仕方がないが、UIで操作する単純な行の挿入のイメージとは処理が違う。挿入する行の前後は、セル結合などは極力してない方がベスト。

元記事を表示

enumのRSpecの書き方

## はじめに
enumのテストコードを書いたので、備忘として残します。

`shoulda-matchers`を使用しています。

## ソースコード

“`app/models/hoge.rb
class Hoge < ApplicationRecord enum status: { hoge: 0, huga: 1 } end ``` ```spec/models/hoge_spec.rb RSpec.describe Hoge, type: :model do describe 'enum' do it { is_expected.to define_enum_for(:status).with_values(hoge: 0, huga: 1) } end end ``` ## 解説 `shoulda-matchers`の`define_enum_for`を使うと上のように書けます。 `with_values`ではなく、`with`でもテストは通りますが怒られます。 簡単ですね! ## 参考 [【RSpec】should

元記事を表示

Devise viewのデザインを編集可能にする

#はじめに
導入当初にBootstrapを使ってデザインや配置が変更できなかったので配置できるようにしてみました。
*導入初心者向けです。

# Deviseを導入

実行環境
ruby ‘2.5.3’
gem ‘rails’, ‘~> 5.2.2’
gem bootstrap-sass

##Devise gemをインストール
以下をGemfileに記入し`bundle install`を実行する。

“`
gem ‘devise’
“`
## Deviseのファイルを作成する。
“`
$rails g devise:install
Running via Spring preloader in process 55270
create config/initializers/devise.rb
create config/locales/devise.en.yml
===============================================================================

Some setup y

元記事を表示

Rails初心者の「N+1って何ですか?」にのベテランエンジニアさん超絶わかりやすいアンサー!!!

僕 「N+1ってデータを何回もやりとりしてしまうことのことですよね?(ぼんやり)」
先輩 「そうそう!具体的にいうとね。この例を見て欲しい」

ProductモデルとPatronモデルはアソシエーションしている前提

“`rb
products = Product.all #全体の数をN件とする 
#先輩「ここでN件分の一回呼び出されるよね?正確にはeachしたときなんだけど」
“`
“`rb

products.each do |product| #先輩「ここではさっきN件分呼び出されたものを、一個一個取り出す。つまりN回分呼ぶよね」
product.patrons.each do |patron|
patron.title
end
end
“`
先輩「そうすると結局N+1回分データを取り出す作業していることはわかった?」
僕「なるほど!わかりました!」

先輩「データが少ないときには特に問題にならないかもしれないのだけど、**データが数万とかたくさんのデータを扱うとき**にN+1問題はパフォーマンスを低下させてしまう原因になってしまうんだ。」
僕 「確かにそう

元記事を表示

Google Mapを「投稿画面」と「詳細画面」の2か所に実装してみた。

# はじめに
こんにちは!現在、アウトプットの一環として個人開発を行っているんですが、エラーでボコボコにされてる今日この頃です!
という話は置いといて、本記事ではレビューの投稿機能にGoogleMapを表示させてみた話をしたいと思います!

# 実装したいこと
– 投稿ページ(new)にて住所(または地名)を入力してもらう。
– 投稿ページのGoogleMapにマーカーを落とす。
– 詳細ページ(show)のGoogleMapを表示。投稿時に指定した場所にマーカーがある。

# 開発条件
Ruby 2.5.1
Rails 5.2.3
Haml・Sass記法

# データベース
## reviewテーブル
|Column|Type|Options|
|——|—-|——-|
|title|string|null: false|
|description|text|null: false|

### Association
– has_one :spot

## spotテーブル
|Column|Type|Options|
|——|—-|——-|
|a

元記事を表示

ネストしたindexにYoutube動画埋め込み

# ネストしたindexへの動画埋め込み備忘録
https://qiita.com/Kairi_Yasunnde/items/8e931a4670549ba8237e
上記の記事を参考にしたが、自分はgroupテーブルにYoutube_urlを入れてcreateに定義し、groupでネストしたmessages/indexに埋め込もうとして、コントローラーの差異があり出来なかったと推測する。

“`routes.rb
resources :groups, only: [:new, :create, :edit, :update, :show, :destroy] do
resources :messages, only: [:index, :create, :destroy]
end
“`

なのでYoutube_urlを生値のまま取り出し、ビュー上で末尾11桁をとり出すようにした。
※Youtubeは末尾11桁の文字、数字が各動画に割り当てられている。

# 手順

まずは、groupにYoutube_urlのカラムを追加する。
ターミナル上で、groupテーブルに

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – ステータスフィード

# 何をするのか

Railsチュートリアル本文[13.3.3](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-a_proto_feed)にて、「ユーザー自身のポストを含むマイクロポストのフィード」を実装しました。さらに、14章ここまでで「ユーザーのフォロー」という機能も実装しました。今度は「ユーザー自身のポストと、フォローしているユーザーのポストの両方を含むマイクロポストのフィード」を実装しよう、というわけです。

ステータスフィードの完成形は、Railsチュートリアル本文においては、[図 14.21](https://railstutorial.jp/chapters/following_users?version=5.1#fig-home_page_feed_mockup)にて示されています。

# 動機と計画

別記事にて解説しています。

[Railsチュートリアル 第14章 ユーザーをフォローする – ステータスフィード実装の動機と計画(データモデルの解説とテストの実装)](https:/

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – ステータスフィード – サブセレクト

# 前準備 – `where`メソッド内の変数に、キーと値のペアを使うようにする

`where`メソッドの第1引数であるSQL文において、Rails側の変数の内容を使う部分は、これまで`?`(疑問符)として与えてきました。以下のようなメソッド呼び出しがその例です。

“`ruby:
Micropost.where(“user_id IN (?) OR user_id = ?”, following_ids, id)
“`

`where`メソッドは、実は「上記`?`の部分に、`?`ではなくRubyのシンボルを与える」という使い方ができます。以下のようなメソッド呼び出しがその例です。

“`ruby:
Micropost.where(
“user_id IN (:following_ids) OR user_id = :user_id”,
following_ids: following_ids,
user_id: id
)
“`

結果、`app/models/user.rb`内の`feed`メソッドは以下のように変更できます。

“`diff:app/mode

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – 演習 「フィードを初めて実装する」

# 1. [リスト 14.44](https://railstutorial.jp/chapters/following_users?version=5.1#code-initial_working_feed)において、現在のユーザー自身の投稿を含めないようにするにはどうすれば良いでしょうか? また、そのような変更を加えると、[リスト 14.42](https://railstutorial.jp/chapters/following_users?version=5.1#code-full_feed_test)のどのテストが失敗するでしょうか?

「(フォローしているユーザーの投稿は含まれるが)現在のユーザー自身の投稿が含まれない」というのは、以下のようなSQL文になるはずです。

“`sql:
SELECT * FROM microposts
WHERE user_id IN ()
“`

上記SQL文に対応する`where`メソッドの記述は、以下のようになります。

“`ruby:
Micropost.where(“user_id IN (?)”,

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – ステータスフィード – フィードを初めて実装する

# フィードに必要となるSQLクエリと、対応する`where`メソッドの引数

要件は以下です。

* 対象ユーザーがフォローしているユーザーのユーザーidを持つマイクロポストを全て選択する
* かつ、対象ユーザー自身のマイクロポストも全て選択する

以上の要件を満たす最小限のSQLクエリを模式的に書くと、以下のようになります。

“`sql:
SELECT * FROM microposts
WHERE user_id IN () OR user_id =
“`

「ログインしているユーザーがフォローしているユーザーのid」というのは、多くの場合複数となります。ゆえに、それらをクエリ問い合わせに使う場合、単一の値ではなく集合として与えなければなりません。そのような場合に使うSQLのキーワードが`IN`となります。

Active Recordでは、`where`メソッドを使うことによって、SQL文の`WHERE`以下に相当する検索条件を与えることができます。上記のSQL文に対応する`where`メソッドの引数の与え方は以下のようになり

元記事を表示

OTHERカテゴリの最新記事