DK’s diary

プログラミング初学者による発信

Google Maps API 本番環境でマップが表示されない件

事の発端

Ruby on Railsを用いてAgri helpという、農作業を助け合おうという趣旨のアプリケーションを制作しました。
概要は、ユーザー同士でチャットを利用して作業を依頼し、その内容をもとに実際に作業するというものですが、自分の近辺に住んでいるユーザーでないと意味がありません。
そこで、会員登録済みのユーザー住所(市区町村まで)がGoogleマップ上に反映され、自分の近くのユーザーを選択できるようにしました。
最低限の機能は搭載できたので本番環境にデプロイしたところエラーが発生。(泣)
f:id:dkdkdk3:20200605143913p:plain


コンソールでエラーメッセージを確認してみると、
f:id:dkdkdk3:20200605145916p:plain


とあり、リファラーが許可されていないという内容でした。
つまり、自分のGoogle Maps APIによりマップが反映される許可の範囲にこのページは入っていないという事です。

そこでGoogle Cloud PlatformでAPIの認証情報を確認しに行くと、凡ミスに気がつきました・・・。
f:id:dkdkdk3:20200605150321p:plain


ウェブサイトの制限がlocalhostのみになっています。ローカルで開発を進めていてそのままの状態でした。



解決方法

ウェブサイトの制限の欄に本番環境でのURLを追加すれば解決できそうな気がします。

f:id:dkdkdk3:20200605151120p:plain


ページ内右側の例を参考に記述を行いました。

f:id:dkdkdk3:20200605151234p:plain


表示されるようになりました!
エラーが出るとソースコードの間違いを疑ってしまいますが、今回はAPIの認証が誤りでした。

deviseにおいて登録したい項目を追加する方法

deviseの導入

deviseはRailsのgemの一つで簡単にユーザー管理機能を実装できます。
まずGemfileに記述をします。

gem 'devise'


忘れずにbundle installしましょう!
次にdeviseの設定ファイルを生成します。
ターミナルにて以下のコマンド入力します。

rails g devise:install


次にuserモデルの作成を行いますがdeviseを利用する為に、通常のコマンドとは異なります。
ターミナルにて以下のコマンド入力します。

rails g devise user


これにより、マイグレーションファイルの生成やroutes.rbファイルにルーティングの記述が自動的に行われており、新規登録やログインのルーティンが設定されています。


routes.rb

Rails.application.routes.draw do
  devise_for :users         #自動で追記
end

rails routesで設定されているルーティングを確認すると、


f:id:dkdkdk3:20200504212607p:plain



sessionやらregistrationやらとルーティングがしっかり設定されています!
では次に、生成されたマイグレーションファイルに追記を行います。
deviseではemailとpasswordについてあらかじめ設定されています。
今回はnameカラムを追加してみましょう。


マイグレーションファイル

          .
          .
t.string :email,              null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name      #追記
          .
          . 


忘れずにマイグレートしましょう。


最後に実際に新規登録画面を確認しましょう!
http://localhost:3000/users/sign_upにアクセスします!



f:id:dkdkdk3:20200504214802p:plain


このように最低限ではありますが、自動的にビューも整っています。
いい感じになっていると思いきや、追加したnameの欄がありません。
残念ながらマイグレーションファイルに追記しただけではdeviseの機能には反映されません。



追加の項目を反映させるには(ビュー画面編)

まずビューにnameの登録欄を作成しましょう!
実は、今までの過程でdeviseのビュー画面は生成さてていません。


ターミナル

rails g devise:views


これでapp/views/deviseの各ディレクトリ内にファイルが生成されます。
今回は新規登録画面を編集するので、registrations内のnewファイルに追記します。

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>


f:id:dkdkdk3:20200504221124p:plain



ビューにも反映されました!
しかしこのままではまだデータベースに登録はされません。
なぜならストロングパラメーターを設定していないからです。


追加の項目を反映させるには(ストロングパラメーター編)

deviseに追加の項目を設定した場合、app/controllers/application_controller.rbを編集します。

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end


sign_upアクションのnameキーを許可するように記述しました。
これでデータベースにも反映されるようになりました!

因みに、今回は新規登録のみなのでsign_upアクションのみ許可しましたが、登録内容の編集を反映させたいときはaccount_updateアクションについても記述しないと変更内容が保存されないので注意です。

RailsへのBootstrapの導入

はじめに

 Railsを使用したオリジナルアプリの作成の過程で(まだrails newしたばっか 笑)Bootstrapを導入したので、その方法を紹介します。プログラミング初心者で導入を考えている人は参考にしてみてください!
筆者自身もHTML/CSSから勉強を始めて約1ヶ月です。間違えている点がありましたらフィードバックをよろしくお願いいたします。


筆者の開発環境

mac OS Mojave
Ruby 2.5.1
Rails 5.2.3
アプリケーションの立ち上げができている状態から説明しています。



f:id:dkdkdk3:20200426014227j:plain


①Gemfileへの記述

 まず以下2点をGemfileに追記します。

gem 'bootstrap', '~> 4.4.1'
gem "jquery-rails"

その後ターミナルで忘れずにbundle installしましょう!

参考
v4-alpha.getbootstrap.com


application.scssとapplication.jsファイルへの追記

 次に、インストールしたBootstrapが機能するように既に存在してあるapplication.scssとapplication.jsファイルに追記を行います。なぜこの2つかと言うと、application.html.erbファイル内の記述を見るとわかります。以下はheadタグ内のとある2つの記述を抜粋したものです。

    <%= stylesheet_link_tag    'application', media: 'all' %>
    <%= javascript_include_tag 'javascript' %>

application.html.erbファイルは全てのビューファイルが集約されるものであり(イメージ)、つまりビューファイルの王様みたいなやつがstylesheetはapplicationを、javascriptもapplicationの内容を読み込んで反映するぞと言っています。なので見出しの2ファイルにBootstrapが反映されるように記述する必要があるのです。
※本来上記のコードにはturbolinksに関する記述もありますが筆者は削除してあります。

では本題に戻ります。
まずはapplication.scssからです。
このファイルの拡張子が.cssの方は.scssにリネームをお願いします。理由は、今回インストールしたBootstrap4ではCSSでなくSassが採用されているためです。
app/assets/stylesheets/application.scss

@import "bootstrap";


次にapplication.jsです。
app/assets/javascripts/application.js

//= require jquery3
//= require popper
//= require bootstrap-sprockets


以上でRailsへのBootstrap導入は完了です!


Bootstrapの利用方法

 Bootstrap公式サイトで目的のコードを引用することで同じデザインの目標物を作成することができます。
例えばボタンであれば、
f:id:dkdkdk3:20200426094310p:plain


https://getbootstrap.com/docs/4.4/components/buttons/




これらのコードをコピーして、自分のHTMLファイルに ペーストします。

<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-secondary">Secondary</button>
<button type="button" class="btn btn-success">Success</button>
<button type="button" class="btn btn-danger">Danger</button>
<button type="button" class="btn btn-warning">Warning</button>
<button type="button" class="btn btn-info">Info</button>
<button type="button" class="btn btn-light">Light</button>
<button type="button" class="btn btn-dark">Dark</button>

<button type="button" class="btn btn-link">Link</button>


以下のように同じものを作成できました。実際はこの中から使用したいものを抜粋して利用しましょう!



f:id:dkdkdk3:20200426094735p:plain


あとはこのまま使うもいいし、またカスタマイズも可能です。
その方法はまた今度紹介します!

Railsにおけるコントローラーの削除方法

コントローラーの作成について

ターミナルにて、作業中のアプリケーションのディレクトリで以下のコマンドを実行します。今回は、tweetsコントローラーを作成するつもりがtweetssとsが1つ多くついてしまった例で話を進めます。

# コントローラーを作成
$ rails g controller tweetss


結果以下のようにcreateと表示されていることから、コントローラーのファイル(app/controllers/tweetss_controller.rb)が生成できています。また、tweetssコントローラー用のviewファイルやヘルパーファイルなども一緒に生成されています。
invokeは生成したファイルのRailsにおけるフレームワークの機能を表示しているだけです。)

create  app/controllers/tweetss_controller.rb
invoke erb
create app/views/tweetss
invoke test_unit
create test/controllers/tweetss_controller_test.rb
invoke helper
create app/helpers/tweetss_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/tweetss.coffee
invoke scss
create app/assets/stylesheets/tweetss.scss


コントローラーの削除について

生成済みのコントローラーファイルを削除するには以下のコマンドを実行します。

# コントローラーの削除
$ rails d controller tweetss


結果以下のようにremoveと表示されていることからコントローラーファイルが削除されていることが確認できます。
それだけではなく、同時に生成された関連ファイルも一緒に削除できます。

remove  app/controllers/tweetss_controller.rb
invoke erb
remove app/views/tweetss
invoke test_unit
remove test/controllers/tweetss_controller_test.rb
invoke helper
remove app/helpers/tweetss_helper.rb
invoke test_unit
invoke assets
invoke coffee
remove app/assets/javascripts/tweetss.coffee
invoke scss
remove app/assets/stylesheets/tweetss.scss

ちなみに生成時に打ったコマンドの"rails g controller..."の"g"はgenerate(生成する)で、削除時の"d"はdestroy(破壊する)の略称です。

JavaScriptの変数宣言について

変数宣言とは

JavaScriptでは変数を定義する際に、変数宣言を行う必要があります。
簡単な例をあげます。

let name = 'tanaka'

nameという変数にtanakaを代入していますが、上記のように変数名の前にletが必要になります。
このように、「nameは変数だよ!」とletをつけて教える必要があり、これが変数宣言になります。

変数宣言の種類

上記では変数宣言にletを使用しましたが、他にvarとconstで変数宣言を行うことができます。varについてはES2015(ES6)バージョン以前の古い書き方なので、これからはletとconstを使用していくものとして2つの違いを説明していきます。


let
let name = 'tanaka';
console.log(name + 'さん、おはよう!');


コンソールで確認すると、以下のようになります。

f:id:dkdkdk3:20200415224158p:plain



次にnameの中身を'watanabe'に変えてみましょう。

let name = 'tanaka';
console.log(name + 'さん、おはよう!');
name = 'watanabe';
console.log(name + 'さん、おはよう!');


コンソールで確認すると、
f:id:dkdkdk3:20200415224720p:plain


このようにletで変数宣言をした場合は、変数の書き換えが可能です。


const

では、constで変数宣言をした場合です。同じように変数nameに代入していきます。

const name = 'tanaka';
console.log(name + 'さん、おはよう!');


コンソールで確認すると、
f:id:dkdkdk3:20200415225611p:plain


letの時と同様に表示がされています。では、変数を上書きしてみましょう。

const name = 'tanaka';
console.log(name + 'さん、おはよう!');
name = 'watanabe';
console.log(name + 'さん、おはよう!');


コンソールで確認すると、
f:id:dkdkdk3:20200415225908p:plain


エラーが起きてしまいました。
このようにconstでは変数の上書きができません。
ここが2つの違いになるので、状況により使い分けましょう。

基本的なHaml記法

Hamlとは

まずHamlという言葉自体を理解することで、この言語の役割が見えてくると思ったのでそこから説明します!
Hamlは、"HTML abstraction markup language" の略称です。"abstraction"の訳が"抽象的"とありますが、これはwikipediaによると・・・

抽象化(ちゅうしょうか、英: Abstraction、独: Abstraktion)とは、思考における手法のひとつで、対象から注目すべき要素を重点的に抜き出して他は捨て去る方法である[1]。反対に、ある要素を特に抜き出して、これを切り捨てる意味もあり、この用法については捨象(しゃしょう)という[1]。

ja.wikipedia.org
う〜ん、わかりますか?(笑)。個人的には "要素を重点的に抜き出し" という所に注目し、簡略化するということなのかなと考えました。"抽象化"の反対語が"具体化"なので、まあこんな感じの認識でいいんですかね。
ちなみに答えはHamlの公式サイトを見ると分かり、(最初からここを見ろよ!笑)
haml.info
Hamlを使用することで、「綺麗に」、「読みやすく」、「生産的に」ビューを作成することができる。
と訳すことができると思います。
つまり、HTMLより記述量が少なく済み、非常に綺麗に簡潔に作成することが可能ということです。

タグの表記

さて前置きが長くなってしまいましたが本題に入って、
まずはタグについてHaml記法とHTMLとを比較します。

%body
  %div
    これはタグ

このように%を使用します。もうひとつ、適切にインデントされていないとエラーを起こします。
これをHTMLで表記すると

<body>
  <div>
    これはタグ
  </div>
</body>
classやidの指定
%div.content#red
  .でcontentというクラスを指定、#でredというidを指定
<div class = "content" id = "red">
  .でcontentというクラスを指定、#でredというidを指定
</div>
divタグは省略できる

divタグは頻繁に用いるので以下のように省略して記述することが可能です。

%div.content#red
  省略前
.content#red
  省略後
link_toメソッド

Railsにおけるlink_toメソッドはHaml記だと以下のようになります。
※リンク先をURLかpathで指定するかで少し違います。

= link_to "表示名",  "URL" 
または
= link_to "表示名",  path

このようにerbタグ(<%= %>)が先頭の "=" に置き換わっています。
pathでリンク先を指定する場合はダブルクォーテーション("")は使用しません。
Railsではこちらが推奨されているかと思います。

おわりに

以上、基本的なHaml記法でした!
HTMLの閉じタグや、そもそもdivも書かなくて良いなど、記述量をかなり抑えられることが分かったと思います。
今回紹介したものは本当に基本的な所なのでまだたくさんのHaml記法があります。
また後日調べてまとめようと思います!

.click()と.on("click")の違い

今回のテーマ

現在jQueryを学んでますがクリックイベントの取得について以下の2つの記述があり困惑したので、何がどう違うのか個人的に調査してまとめました。

.click()
$('#button').click(function() {
  alert("ボタンが押されました");
});

.click()はjQuery公式ドキュメントではこう説明されています。

Bind an event handler to the "click" JavaScript event, or trigger that event on an element.

クリックすることでイベントを発火することが出来るということでした。
また、こうとも書いてあります。

This method is a shortcut for .on( "click", handler )

.click()は.on("click")のショートカットだったんですね!

.on("click")
$('#button').on('click', function() {
  alert("ボタンが押されました");
});

.on("click")はjQuery公式ドキュメントではこう説明されています。

Attach an event handler function for one or more events to the selected elements.

.clickとの違いは、 one or more events のところでしょうか。訳すと、1つかそれ以上のエレメントにイベントを付属する、です。つまり複数のイベントを定義できるということになります。
例えば、.click()ではイベント発生後に新たなボタンが現れたとしたら、イベントを付与できないが、.on("click")ではそれが可能ということになります。

まとめ

.click()は.on("click")のショートカットでした。
しかしその後に複数のイベント起こしたいのであれば.on("click")でなければ出来ないので、複雑な機能を組むのであればこちらを使うべきでしょう。