Rails 6 でTodoApp作る part1

Rails6を使って簡単なTodoAppを作っていきます。 後から自分で見て復習できるような感じで書いていきます。


環境 macローカル
Ruby 2.6.5
Rails 6.0.2.1
% rails new todo_app

% cd todo_app

% rails db:create
Created database 'db/development.sqlite3'
Created database 'db/test.sqlite3'

% rails s

f:id:yukitoku_sw:20200115210555p:plain

初期設定

slim化

Gemfileにgem 'slim-rails'gem 'html2slim'を追記する


[ Gemfile ]

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.5'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.2', '>= 6.0.2.1'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '~> 1.4'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'slim-rails' # 追加
gem 'html2slim' # 追加
% bundle

これでslim化されます。 しかし、rails newにより作成されたapp/views/layoutsの中身はerbのままなので、それらをslim化する

% bundle exec erb2slim app/views/layouts/ --delet

これでアプリのslim化が完了

Rails 6 + webpacker + Bootstrap

わかりやすかった↓記事から自分に必要な部分を真似させていただきました。

Rails 6+Webpacker開発環境をJS強者ががっつりセットアップしてみた(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社


Rails 6 ではwebpackerを使ってjavascriptを使うのが乙なようですよ。

今までは、app/assets/stylesheet/application.scssからBootstrapを読み込んでいたが、webpackerでは、`app/javascript/packから読み込む。

そのためにはapplication.html.slimを変更する必要があります。

変更前 = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' 変更後 = stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'

link を pack に変更し下記のようになります。


[ app/views/layouts/application.html.slim]

doctype html
html
  head
    title
      | TodoApp
    = csrf_meta_tags
    = csp_meta_tag
    = stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload'
  body
     = yield

これにより、app/javascript/pack/application.jsを読み込むようになります。

しかし、jsファイルにcssを書くことはできないのでscssファイルを作成します。


[ app/javascript/src/style.scss ]

@import "~bootstrap/scss/bootstrap"; 

app/javascript/内であればフォルダ名・ファイル名はなんでもok。

そして、app/javascript/pack/application.jsにもimportします。


[ app/javascript/pack/application.js ]

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

// Uncomment to copy all static images under ../images to the output folder and reference
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
// or the `imagePath` JavaScript helper below.
//
// const images = require.context('../images', true)
// const imagePath = (name) => images(name, true)

import "../src/style" # 追加


やっとこさBootstrapのインストールです。

しかし、webpackerを使う場合はbundle installではなくyarnを使います。


[ コンソール ]

% yarn add bootstrap jquery popper.js

Bootstrapに必要な依存関係の奴らも一緒にインストール

インストールしたファイルをrequireします。


[ app/javascript/pack/application.js ]

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

require("jquery");   # 追加
require("bootstrap");  # 追加

// Uncomment to copy all static images under ../images to the output folder and reference
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
// or the `imagePath` JavaScript helper below.
//
// const images = require.context('../images', true)
// const imagePath = (name) => images(name, true)

import "../src/style"


Yarnの設定


[ コンソール ]

yarn policies set-version 1.21.1

1.21.1は私が使ったバージョンなので最新版を使った方が良いかと思います。

package.jsonnodeyarnを追加すると下記のようになります。


[ package.json ]

{
  "name": "todo_app",
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "4.2.2",
    "bootstrap": "^4.4.1",
    "jquery": "^3.4.1",
    "popper.js": "^1.16.0",
    "turbolinks": "^5.2.0"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^3.10.1"
  },
  "engines": {                     # 追加
    "node": "13.5.0",          # 追加
    "yarn": "1.21.1"             # 追加
  }
}

以上で、初期設定はおしまいです。

次回、Task作る

Railsポートフォリオ作成【実装編】Userモデルを作る②

今日は休み!肉体労働者です。

前回

yukitoku-sw.hatenablog.com


では、とことん作っていくっ

Userモデル
Userコントローラー
viewをざっくり

をやりたい


ユーザー登録機能を作る

GitHubをフル活用

% git checkout -b sign-up

よし


scaffoldで作ったUserは、ほぼほぼ出来上がっている。すごい。
そこに、自分で考えた設計に必要なものを付け加えていく

テストもしっかり書いていくっ。

がしかし。。

rails g integration_test users_signup

.
.
.

assert_templateが使えない!


なぜ?

この記事が参考になりました。
Rails5でコントローラのテストをController specからRequest specに移行する - Qiita

どうやら、

  • assignsとassert_templateの使用が非推奨となったみたい。

  • gem 'rails-controller-testing'を使えば、assignsとassert_templateはそのまま使える。

  • しかしrequest specへ移行することが望ましい。

なので、テストの作成を中止して、Userをシャシャシャっと完成させてrequest specを取り入れていく!

一端、その場しのぎ

gem 'rails-controller-testing'


テストを書かなければ意外とスラスラ書ける

git add -A
git commit -m "Finish user signup"
git checkout master
git merge sign-up
git push

とりあえずよし

その他もろもろ作成&cssをある程度整える

git checkout -b updating-users

アクションを整える。画像投稿機能と表示。そして、cssを整えた!

そして、めちゃめちゃ時間がかかった!!

理由

  • 画像投稿機能を参考にした記事が古かった・・

  • bootstrap及びcssの知識がほぼ消えていた・・

画像投稿はすぐできたが、投稿がなかった場合のデフォルト機能が難しかった
最終的に参考にした記事

https://pg-happy.jp/carrierwave-rmagic-uploader.html

CarrierWave デフォルトの画像を表示する default_url - 196Log

github.com


bootstrapとcssに関しては、たっくさんの記事を見た
今までチュートリアルで勉強していたので、改めて自分で考えたものを形にする難しさを学んだ。。もっといろいろなパターンを繰り返し作ってみないと全然だめだ

まーとりあえず今日のところはよしとしよう

git add -A
git commit -m "Finish user edit, update, index, and destroy actions"
git checkout master
git merge updating-users
git push


明日からはPostモデルを作っていく!

おわり

Railsポートフォリオ作成【実装編】Userモデルを作る

昨日はYouTubeのせいで更新できませんでした。肉体労働者です。

今日もポートフォリオ作成を行っていくっ

前回

yukitoku-sw.hatenablog.com


前回Gitで管理する方法を学んで思ったんだが、ガントチャートを書き直す必要がある ざっくりとそのまま真似したのがいけなかった。。

f:id:yukitoku_sw:20191130202914p:plain

これの実装編の部分は、ブランチ名単位で予定を組むべきであった・・

明日作り直そう!!! うん! 今日ではない!!

よし、今日はUserモデルを作る

復習がてらRailsチュートリアルを非情に参考にする。

まず、GitHubをフル活用する

% git checkout -b modeling-users
Switched to a new branch 'modeling-users'

よしっ


全く一緒ではつまらないのでscaffoldを使ってみる

% rails g scaffold user name:string email:string
Running via Spring preloader in process 33992
      invoke  active_record
      create    db/migrate/20191207112407_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    slim
      create      app/views/users
      create      app/views/users/index.html.slim
      create      app/views/users/edit.html.slim
      create      app/views/users/show.html.slim
      create      app/views/users/new.html.slim
      create      app/views/users/_form.html.slim
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      create      test/system/users_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss

ものすごい大量に作成される!

これおすすめ
いつも忘れる「Railsのgenerateコマンド」の備忘録 - maeharinの日記


ここからは一気に作りたい気持ちを抑えて慎重に作っていくっ

最初はnameとemailだけのUserモデルを作り、testを書く→エラー→モデルを書く→テストが通る。という流れを意識して書く

簡単な検証だけ真似しようと思ったがrailsチュートリアルの内容は全部重要そう(当たり前か・・)だったので全て採用した!

ここでは "まだ" オリジナリティーなど必要ない。大丈夫


Userモデルにパスワードを追加する

$ rails generate migration add_password_digest_to_users password_digest:string

Userモデル作成時にまとめて作っても良かったが、あえて分けた。
次からはまとめて野郎!

「has_secure_password と gem 'bcrypt'」
この組み合わせでパスワードをハッシュ化する

ハッシュ化することでデータベースからパスワードが盗まれても、使えないようにすることができる。
盗まれないようにできるわけではない。。

bcryptの詳細
GitHubhttps://github.com/codahale/bcrypt-ruby

RubyGemshttps://rubygems.org/gems/bcrypt/versions/3.1.12


ひとまずこんなとこ

git にcommitしてmergeする (ルー)
コメントは丸パクリする!!

$ rails test
$ git add -A
$ git commit -m "Make a basic User model (including secure passwords)"

$ git checkout master
$ git merge modeling-users
$ git push


おっけいです

Railsポートフォリオ作成【設計編】準備

今日は定時で帰れてハッピーな肉体労働者です。

今日もポートフォリオ作成を進めていくっ

前回

yukitoku-sw.hatenablog.com


今回は設計編、準備。ということでチョコチョコやってGitHubリポジトリを作成までいきたい!



まずは、バージョン確認

% ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]

% rails -v
Rails 6.0.1

% postgres -V
postgres (PostgreSQL) 11.5

HerokuでアップしたいのでデータベースはPostgreSQLを使用します


そして、rails new

% rails new アプリ名 -d postgresql

% cd アプリ名 # 作成したアプリに移動

% rails db:create # データベースを作成

% rails s # サーバー起動
 \やったぜ/

f:id:yukitoku_sw:20191205221048p:plain


いきって、Slim

せっかくなのでSlimを使用する

[Gemfile]

gem 'slim-rails'
gem 'html2slim'

Gemfileにgemを2つ追加

bundle

rails newの時点で app/views/layouts にerbのファイルが作成されているので、Slimに変更する

% bundle exec erb2slim app/views/layouts/ --delete

erbからslimに変更されているのを確認!ok


念のため、Bootstrap

cssを弄くり回したい欲望はあるんですが、とりあえずBootstrapでざっくり作る

[Gemfile]

gem 'bootstrap'

先ほど追加したgemの下にbootstrapをスイカ

bundle

cssをscssに変更

% rm app/assets/stylesheets/application.css
% touch app/assets/stylesheets/application.scss

作成したファイルにbootstrapを適用させる

[application.scss]

@import "bootstrap";

ok


最後に、GitHub

% git init
% git add -A
% git commit -m "Initialize repository"

GitHubでレポジトリを作成してブッ込む!

% git remote add origin https://github.com/ユーザー名/レポジトリ名.git
% git push -u origin master

できた!!


調べながらやってたら試したいgemや設定があった!
けど、とりあえず今の状況で開発を進めていくことにする。自分で設計したものをひとまず完成させて年末年始を利用してバージョンアップさせていこう!


おわり〜!

Railsポートフォリオ作成【設計編】機能設計

とても眠い、肉体労働者です。

今日も、ポートフォリオ作成を行っていく


前回

yukitoku-sw.hatenablog.com


今回は、機能設計!
もっというとコントローラーの設計


f:id:yukitoku_sw:20191204215442p:plain


こんな感じ
作成したワイヤーフレームにメモを貼り付け、各ボタンごとにどのような挙動をするのかまとめる

各ボタンごとに、ざっくりと自分でわかるようにアクションの内容をまとめる


  • どのコントローラーのどのアクションが呼び出される?

  • そのアクションはどんな内容なの?

すると開発の際に悩まずにすむ

と、言い聞かせて地道に地味に悩みながらやりました。。


ちゅうことです!


いよいよ!明日から実装編に突入です!


大丈夫なのか!

Railsポートフォリオ作成【設計編】データモデルを設計する

とっても眠いです。肉体労働者です。


前回に続きポートフォリオを作成していく〜

yukitoku-sw.hatenablog.com


今回はデータモデルの設計をする


「データモデルの設計」と調べてもよくわかりません
なんか、難しい、すごい、複雑なデータモデル設計のものばかりです。


しかし、わたしは、見つけた。

qiita.com

丁寧すぎて、わたしのような初心者でも理解できました
超おすすめです


できたのがこちら

f:id:yukitoku_sw:20191203233512p:plain


MySQL :: MySQL Workbenchで作成しました。


参考にした記事

MySQL Workbench でデータモデルを作成してみる – セルティスラボ


とりあえずok!眠い!!

Railsポートフォリオ作成【設計編】デザインをざっくり考える

残業後の肉体労働者です。


今日もポートフォリオ作成の続きをやっていきます!


前回

yukitoku-sw.hatenablog.com


今回は、デザインをざっくり考える!!

いろいろなサイトでアプリ・サイトのデザインを見てみました


が、


よくわからん


なので、Facebook & Instagramを参考にしていくっ!


以上です。