Google Maps Javascript APIの導入(Rails6)
・rails: 6.0.3.4
・webpacker、slim使用
流れとしては
APIキー取得
取得したAPIキーをcredentialsに記載
HTML, javascript, css実装
のステップで行います。
1. APIキー取得
まずはGoogle Cloud PlatformからAPIキーを取得します。
この部分は省略します。(以下の記事がわかりやすかったです。)
Google Maps API を使ってみた - Qiita
2. 取得したAPIキーをcredentialsに記載
取得したAPIキーはcredentials.yml.encに以下の構成で記載。
credentials.yml.enc
api_key: maps_javascript_api: '取得したAPIキー'
取り出すときはRails.application.credentials.api_key[:maps_javascript_api]
3. HTML, javascript, css実装
後は公式通りにビューを実装していきますが、slimでの記法やwebpackに不慣れだったので何点か苦労しました。
app/view/index.html.slim
- google_api = "https://maps.googleapis.com/maps/api/js?key=#{ Rails.application.credentials.api_key[:maps_javascript_api] }&callback=initMap".html_safe script{ async src = google_api } div#map
callback処理でjsでinitMap関数を呼び出し、div id='map'
の部分にgoogleマップが埋め込まれます。
app/javascript/google_maps.js
function initMap() { map = new google.maps.Map(document.getElementById("map"), { center: { lat: 35.6581, lng: 139.7017 }, zoom: 14, }); } window.initMap = initMap;
center:
でマップの中心座標、zoom:
で縮尺のデフォルト表示の設定ができます。
また、window.initMap = initMap;
の部分は下記を参考に追加しました。
javascript - Google Maps APIでWebpackを使用するには?
この記述がないとinitMap is not a function
のエラーによりマップが表示されませんでした。
webpackを使っている場合はグローバル変数領域に宣言する必要があるようです。
参考:(この質問の回答がわかりやすかった)
JavaScript - webpack環境で関数をコンソールで実行したところエラーが返る|teratail
app/javascript/stylesheets/application.scss
#map { height: 400px; width: 600px; }
マップの表示サイズを設定します。
height: 100%
など、%で指定するとマップが表示されないのでpxでの指定が必要です。
app/javascript/packs/application.js
require("google_maps.js")
最後にapplication.jsでrequireすればマップが表示されると思います。
RSpecでActionMailerのテスト
RSpecのSystemSpec内でメール送信のテストを行う際のメモ。
mailers/article_mailer.rb
class ArticleMailer < ApplicationMailer def report mail(to: 'admin@example.com', subject: 'HOGE') end end
送信メールを上のように定義。
テスト環境でもArticleMailer.report.deliver
でメール送信できるので
letに入れて書くと、
mailer_spec.rb
require 'rails_helper' RSpec.describe "Mailer", type: :system do let(:mail) { ArticleMailer.report_summary.deliver } let(:check_sent_mail) { expect(mail.present?).to be_truthy, 'メールが送信されていません' expect(mail.to).to eq(['admin@example.com']), 'メールの送信先が正しくありません' expect(mail.subject).to eq('HOGE'), 'メールのタイトルが正しくありません' } describe 'メールの送信' do context 'メールを送信した場合' do it 'タイトル、メールアドレスが正しく送信される' do check_sent_mail end end end end
check_sent_mail内でlet(:mail)
も呼ばれるので、
メール送信+検証ができる。
mail.to
で送信先
mail.subject
でタイトル
mail.from
で送信元
mail.body
で本文を参照。
開発環境ではgem letter_opener_webを使用して/letter_opener内で確認してたので
SystemSpec内でもvisit '/letter_opner'
で飛ぼうとして飛べなくて
ハマってたのでメモ。