Docker環境下のRailsで食品栄養成分表をDBに登録
dockerでRailsの環境を作成
下記の記事を元にRailsの新規プロジェクト環境を作成できるテンプレートファイルを作成
webpackerとはなにか?
Railsの環境構築にあたり「webpacker」というものがでてきたので調査。「webpack」とは違うの?
ざっくり言うと、Railsのプロジェクトでwebpackを楽に使えるようにしたもの。
詳細については下記の記事に書いてある。
module bundlerとは
モジュールバンドラー(module bundler)は、文字通りモジュールをひとまとめにする(bundle)ツール。モジュールバンドラーの代表格のひとつである webpack でも使用されている言葉。 ひらたく言うと、JavaScriptの依存関係を解決し、それらをインクルードしたひとつのファイルにまとめてくれるもの。
docker落とした後再起動時にwebサーバーが起動しなくなった
log通りに対応
========================================
Your Yarn packages are out of date!
Please run `yarn install --check-files` to update.
========================================
Railsのgitignore作成
*.rbc
capybara-*.html
.rspec
/db/*.sqlite3
/db/*.sqlite3-journal
/db/*.sqlite3-[0-9]*
/public/system
/coverage/
/spec/tmp
*.orig
rerun.txt
pickle-email-*.html
# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep
# TODO Comment out this rule if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/master.key
# Only include if you have production secrets in this file, which is no longer a Rails default
# config/secrets.yml
# dotenv, dotenv-rails
# TODO Comment out these rules if environment variables can be committed
.env
.env.*
## Environment normalization:
/.bundle
/vendor/bundle
# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json
# Ignore pow environment settings
.powenv
# Ignore Byebug command history file.
.byebug_history
# Ignore node_modules
node_modules/
# Ignore precompiled javascript packs
/public/packs
/public/packs-test
/public/assets
# Ignore yarn files
/yarn-error.log
yarn-debug.log*
.yarn-integrity
# Ignore uploaded files in development
/storage/*
!/storage/.keep
/public/uploads
docker環境でrailsコマンドの使用の仕方
docker-compose run web railsのコマンド
これだとdocker-compose run web
と毎回入力するのがめんどくさい。。。
そこで下記コマンドで一旦コンテナの中に入ってしまえば後はrailsコマンドを打つだけで済む。
docker container exec -it コンテナ名 bash
コンテナ名の確認方法
動作しているコンテナのみ表示
docker ps
動作・停止しているコンテナを表示
docker ps -a
Rails controller 作成の仕方
rails g controller コンテナ名
g
はgenerate
の省略記法
スプレッドシートの操作方法
下記を参考に行なった。
こんなものもあった。google_drive
とgoogle-apis-drive
の違いを調べてみた。
google-apis-drive
はgoogle_drive
の中に内包されているようで、スプレッドシートの読み書きを行う場合はgoogle_drive
を使用すればよさそう。
google-apis-driveのメモ
初め、google-apis-drive_v2
を使用した時のエラー(google_driveを使用したので使わなかったけどメモしておく)
どうもgoogle-apis-drive
はバージョンがv3まである様子。
バージョンを変更してあげる必要があった。
require google_driveでもエラーが出た
こちらを利用してもエラーが出てしまった。。gem install 'google_drive'
を実行する必要がある様子。
しかし、これでもできない。。。
もしかしてdockerをbuildし直す必要があるのか??
docker compose build
再起動して確認してみると、、エラー解消された🙌
エラー発生
config.jsonにclient_id,secret_idともに記載されているのにないとエラーがでる。
ここでものすごく時間がかかってしまった、、
OAuthクライアントIDではなくサービスアカウントで行うやり方。
スプレッドシートから読み取り
このスプレッドシートのサンプル栄養素表から各項目を読み取る。
# 栄養素取得
@nutrients = []
(2..@@sheets.num_cols).each do |col|
@nutrients.push(@@sheets[1, col])
end
p "栄養素:#{@nutrients}"
# 食品名取得
@foods = []
(2..@@sheets.num_rows).each do |row|
@foods.push(@@sheets[row, 1])
end
p "食品:#{@foods}"
行を取得しそのまま操作しようとした際の注意事項
# 栄養素取得
@nutrients = @@sheets.num_rows[0].shift()
shift()で先頭の「食品名」だけ削除したほうが効率よさそうなので試してみたが、
freezeされておりerrorがでた。
そのため上記のように直接担当の箇所を読み取るようなやり方をしている。
DBについて調査
この栄養素をどのようなDB設計で登録するのがよいのか決めるため、下記記事をざっくりと読んだ。
DB設計にあたりER図を描けるようになりたいと思う。
ER図作成ツール
LucidChartを使用しようと思う。
直感的に操作でき、ラーニングコストが少なそうな印象を受けたのが選んだ理由。
DB作成
下記の記事を参考にDBとmodelを作成。
命名規則
model名やカラム名を決める際に下記の記事を参考にした。
有名どころのサイトの中でクックパッドがrailsを使用しているとのことで見てみた。
データ型
データ方について曖昧な部分があるため再度確認。
テーブル確認
rails dbconsole
で下記のエラー発生
Couldn't find database client: mysql, mysql5. Check your $PATH and try again.
下記記事を見つけた
mariadb-clientを追加し、dockerをbuildしなおしたら解消された。
ちなみにmariadbでのテーブル確認方法はこれ
show tables;