testをやってみた パート4

時間が空いてしまった時間がすぎるのは早いものですね

今回はこの前deviseの実装を行ったので、今回はそれの、テストコードをやっていきます。

今回使うgemはこちらです。

f:id:karma83:20210227161045p:plain

これを使っていきます

bundle install 

とDockerなので、buildし直していきます。

 

rails g rspec:install

 .rspecの中に

--format documentationを追加

f:id:karma83:20210227161929p:plain

その次に今回テストするものを生成します。

rails g rspec:model user

 これで、作られているものがあります、それを使っていきます。

今回テストしていくことは

User

  #create

    nameとemail、passwordとpassword_confirmationが存在すれば登録できること

    nameが空では登録できないこと

    emailが空では登録できないこと

    passwordが空では登録できないこと

    passwordが6文字以上であれば登録できること

    passwordが5文字以下であれば登録できないこと

    passwordとpassword_confirmationが不一致では登録できないこと

    重複したemailが存在する場合登録できないこと

 

これらを試して、いくのですがいちいちテストするたびに、

名前・email・passwordを書くのは美しくないので、factorybot

文字が同じだったら、それ以外の言葉が通らないとかになってしまうと意味がわからないので、fakerを使います。

f:id:karma83:20210227162455p:plain

passwordは二回使うので、変数に入れて再利用します。

spec/models/user_spec.rb とfactorybotをくっつけます。

RSpec.describe User, type: :model do
describe '#create' do
before do
@user = FactoryBot.build(:user)
end
end
end

 これで、くっつけました。それではテストしていきます。

it 'nameとemail、passwordとpassword_confirmationが存在すれば登録できること' do
expect(@user).to be_valid
end
it 'nameが空では登録できないこと' do
@user.name = ''
@user.valid?
expect(@user.errors.full_messages).to include("Name can't be blank")
end
it 'emailが空では登録できないこと' do
@user.email = ''
@user.valid?
expect(@user.errors.full_messages).to include("Email can't be blank", "Email can't be
blank", "Email is invalid")
end
it 'passwordが空では登録できないこと' do
@user.password = ""
@user.valid?
expect(@user.errors.full_messages).to include("Password can't be blank", "Password conf
irmation doesn't match Password", "Password can't be blank")

end
it 'passwordが6文字以上であれば登録できること' do
@user.password = '123456'
@user.password_confirmation = '123456'
expect(@user).to be_valid
end
it 'passwordが5文字以下であれば登録できないこと' do
@user.password = "12345"
@user.password_confirmation = "12345"
@user.valid?
expect(@user.errors.full_messages).to include("Password is too short (minimum is 6 char
acters)")

end
it 'passwordとpassword_confirmationが不一致では登録できないこと' do
@user.password = "123456"
@user.password_confirmation ="1234567"
@user.valid?
expect(@user.errors.full_messages).to include("Password confirmation doesn't match Pass
word")

end
it '重複したemailが存在する場合登録できないこと' do
@user.save
another_user = FactoryBot.build(:user, email: @user.email)
another_user.valid?
expect(another_user.errors.full_messages).to include('Email has already been taken')
end

 少しこれだと意味がわからないとおもうので、やり方を解説します。

1つ目は @user  は成功するので、成功すると証明になる、be_valid

これで、1つ目は成功です。

it 'nameが空では登録できないこと' do
@user.name = ''
@user.valid?
expect(@user.errors.full_messages).to include("Name can't be blank")
end
これは、まずfacotorybotの中のnameを空にします。その後@userが大丈夫か確認するvalid?(大丈夫)と聞きます。その下に
gem 'pry-rails'

で使えるようになったbinding.pryを使います。valid?で聞いても一瞬で過ぎ去ってしますので、binding.pryで一度そこで、止めてそこでエラーがあるなら、何があるかなどを聞く猶予ができます。エラーがあるかを聞く方法は

docker-compose run web bundle exec rspec spec/models/user_spec.rbとコマンドして、binding.pryのおかげで止まって、猶予ができます。

@user.errors.full_messagesと聞きますそしたら、答えてくれます。

名前が空だからエラーだよってそしたら、binding.pryを消して、

expect(@user.errors.full_messages).to include("Name can't be blank")

これは、何をしているかというと、このときのエラーは、名前がないであるということになります。そしたら、名前がないというエラーは正解なので、ここの部分は完成しました、これを、他の空のやつにも、やっているだけですね。

一様見本に残すとこんな感じに自分はやった。 

f:id:karma83:20210227164348p:plain 

ログイン機能を作ろう。 パート3

devisegemを追加していきます。

参考

Docker使ったRails環境でdeviseを導入する手順 - Qiita

gemfile に

gem 'devise'

その後docker-compose run web bundle install

その後

docker-compose build

そしたら、gemが入っているはずなので、deviseをインストールします。

docker-compose run web rails g devise:install

これで、インストールできたはずなので、viewを作っていきます。

docker-compose run web rails g devise:views

モデルを作っていきます。

docker-compose run web rails g devise user

app/views/deviseの中にviewが追加されていて、

app/models/userというモデルが追加されています。

deviseの初期設定はemailとpasswordの2つです。最小限なものになっています。

ですが、今回はそれに加えて、nameを追加していきたいと思います。

db/migrate/20210223102723_devise_create_users(数字は違うかも?)

この中に t.string :nameを追加

f:id:karma83:20210224160959p:plain

次にapp/cotroller/application_controller.rb

class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
end

5行目のsign_upは新規登録のことで、app/views/devise/registrations/new.erbに名前も追できる欄を追加していきます。

<h2>Sign up</h2>
<div class="container mt-5">
<div class="row">
<div class="col-6 mx-auto">
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>

<div class="form-group">
<%= f.label :name %><br />
<%= f.text_field :name, autofocus: true, class: "form-control" %>
</div>

<div class="form-group">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control" %>
</div>

<div class="form-group">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "new-password", class: "form-control" %>
</div>

<div class="form-group">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: "form-control" %>
</div>

<div>
<%= f.submit "Sign up", class: "btn btn-primary" %>
</div>
<% end %>
 
<%= render "devise/shared/links" %>
</div>
</div>
</div>

 bootstrapの便利さよ、次にこれをheaderとして追加していきたいと思います。

 

headerを作る場所は共通部分として、書きたいので、app/veiws/layout/application.html.erbで、書きます

<nav class="navbar navbar-expand-lg navbar-light bg-light">
<%= link_to 'FLXED_FEE', root_path, class: "navbar-brand" %>
<button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#Navber" aria-controls="Navber" aria-expanded="false" aria-label="ナビゲーションの切替">
<span class="navbar-toggler-icon"></span>
</button>
<% if user_signed_in? %>
<div class="collapse navbar-collapse" id="Navber">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<%= link_to 'マイページ', user_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to '新規投稿', new_recipe_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to '投稿一覧', recipes_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "nav-link" %>
</li>
</ul>
</div>
<% else %>
<div class="collapse navbar-collapse" id="Navber">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<%= link_to 'ログイン', new_user_session_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to '新規登録', new_user_registration_path, class: "nav-link" %>
</li>
</ul>
</div>
<% end %>
 
</nav>

これは、if文で、ログインしているかどうかを、区別して、違う処理をしてくれる

<% if user_signed_in? %> 

を使っています。

あとは、ログイン画面のviewもきれいにして、とりあえず今日はここまで、ちょっと雑なので気が向いたらきれいに編集していきたい!

次回はuserのテストコードを書いていきます。

固定費を勉強できるサイトを作りたい パート2

今回はbootstrapという、cssフレームワークを入れていきたいと思います。

では入れていきたいと思います

参考

初めてのRuby on rails Bootstrap導入編 [Memo for neko] - Qiita

gemfile にこれをいれて、

docker-compose run web bundle install(dockerが入っているから)

gem 'bootstrap', '~> 4.1.1'

app/assets/stylesheets/application.css場所

@import "bootstrap";

これも実行

docker-compose run web mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss

 app/javascripts/packs/application.js

//=require bootstrap

続きをしようとしたとき

docker-compose run web rails g controller list index create show 

これで、コントローラーが作れる!実行!!

f:id:karma83:20210223174058p:plain

え?!エラーが起きた

gemに問題が発生しているみたい

docker-compose build --no-cache

これをやったら処理に結構時間かかったけどその後。。。

f:id:karma83:20210223174537p:plain

 

治ったでは、今回はこんなもんでまた次回にまわします。

次回は、見た目などを作っていく予定です。

 

固定費を勉強できるサイトを作りたい パート1

企画

新しくアプリケーションを作っていこうと思います。

今回作る予定のアプリケーションは固定費共有成長アプリを作ろうと思っています。固定費をみんなどのようにやっているのかを、お互いに見て、固定費のうまい方法があったら、その人に、コメントなどして、教えを乞うことが、できるアプリにしようかと思いました、

まずはどのような機能を入れるか要件定義を行います。

要件定義

f:id:karma83:20210221191537p:plain



簡単に機能の定義はできました!その機能ごとの勉強をしないといけませんね

とりあえずDockerは初めてなので

こちらを参考にやっていこうと考えています。

https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F-Docker-Kubernetes%E8%B6%85%E5%85%A5%E9%96%80-%E4%BC%8A%E8%97%A4-%E8%A3%95%E4%B8%80/dp/4297114283

 

linexもついでに詳しくなっときたかったので、

こちらを見ながら勉強をして、実装していきたいと思います。

Linuxゲリラ戦記

さあ、続きを考えます

 

qiita.com

こちらも参照して、これを中心で、やっていきたいと思います、より具体的です。

必要なfileは

  • Gemfile
  • Gemfile.lock
  • Dockerfile
  • docker-compose.yml
  • entrypoint.sh

やっていたら 

zsh: command not found: docker-compose

このように言われるので、dockerをインストールしていきます。

Docker Hub

  • アカウント作成「Login to download」
  • ダウンロード「Get Docker」
  • Dockerアプリを起動する
  • 管理者パスワードを聞かれるので、入力する

できたらエラーが解消されているはずです

 

 

プロジェクトを開く

www.youtube.com

この動画で、流れの勉強になります。少しバージョンが古い可能性があるので、エラーとかが多いような気がします

 そして、自分も同じようにやって完了と、

f:id:karma83:20210221180748p:plain

 

ER図

VSCode拡張機能Draw.io Integrationを使います

 f:id:karma83:20210221180917p:plain

db.dioで作っていきます。

f:id:karma83:20210221181229p:plain

 

その他の図形から、ERを選びます。そうしたら高度の設定の下にERが登場します。

今回はこれを使ってやっていきます

ました!

f:id:karma83:20210221191102p:plain

 

次にREADME

を作成していきます。

今書けること、テーブルについて記述していきます。

その後も使い方など書いていくのですがそれは、また後で書こうかと思います。

では、書いていきます。READMEはマークダウン記法なので、vscode拡張機能

f:id:karma83:20210222120453p:plain

をおすすめします。では書いていきます

マークダウン記法がわからない人はこの動画をおすすめします。

www.youtube.com

そして、仮ではありますがテーブル部分はできました!

f:id:karma83:20210222135209p:plain

f:id:karma83:20210222135222p:plain

 

それでは、今回はこれくらいで、これから、gem(ライブラリー)を追加していきます。

それでは、また次回に続く

 

 

 

 

 

プログラミンするまえの環境構築、ruby

今回は色々あってosを初期化して、環境設定からやっていきたいと思います。

前提条件

Googlechromeを使っています。

osbig surの2月18日現在最新のバージョン

まずはvscodeを導入していきます。

Visual Studio Code - Code Editing.

Redefined

入れたらdockの方に持ってきて開きます。

右側にある

f:id:karma83:20210218102448p:plain

一番下のボタンを押してこの拡張機能を入れてください。

Code Spell Checker

HTML Snippets

Japanese Language Pack for Visual Studio Code

Ruby

・zenkaku

その後

左下の歯車押して、その後設定を押してください

その後

以下のように設定してください。

f:id:karma83:20210218103247p:plain

これでvscodeはとりあえずOKです。

次にcommand+spaceでターミナルと打ちます。そしてenterキーを押してください

そしたら、よくわからないものが開かれると思います。がこれを使って、色々設定していきます。

ruby 2.6.5

mysql 5.6

でやっていきます。

chsh -s /bin/zsh
echo $SHELL
xcode-select --install

その後インストール→同意→待つ

cd
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

passwordと出るのでpasswordを入力。

(入力画面は見えませんが打てています)

brew -v
Homebrew 2.5.1 # 数字は異なる場合があります。

インストールできているのであれば、

brew update
sudo chown -R `whoami`:admin /usr/local/bin
brew install rbenv ruby-build
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
brew install readline
rew link readline --force
RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
rbenv install 2.6.5
rbenv global 2.6.5
rbenv rehash

MySQLを用意しよう

brew install mysql@5.6
mkdir ~/Library/LaunchAgents
ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist
echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
which mysql
mysql.server status # MySQLの状態を確認するコマンド

# 以下のように表示されれば成功
 SUCCESS! MySQL running

Railsを用意しよう

gem install bundler --version='2.1.4'
gem install rails --version='6.0.0'
rbenv rehash

Node.jsを用意しよう

brew install node@14
echo 'export PATH="/usr/local/opt/node@14/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

yarnを用意しよう

brew install yarn

yarn -v

 

Sequel Proをダウンロードし、インストールしましょう

Downloads

ダウンロードしたものをアプリケーションフォルダに入れます。

そうしたら、command + spaceでsequal proを起動します。そうしたら

ソケットのなまえをlocalhost

ユーザ名をrootにします。

そしたらお気に入りを押して、接続!

GitHubアカウント

github.com

 

ここで、サインアップして、

その後、Join a free plan→Complete setu

p

メールの確認を行うように画面に表示されますので、メールの確認を行います。
登録したメールの受信箱にアクセスして、GitHubから送信されたメールを開きましょう。「@ユーザー名」と「メールアドレス」を確認して、登録内容と間違っていなければ「Verify email adress」をクリックしましょう。こちらも、とくに選択する必要はありませんので「Skip this for now」をクリックしましょう。

 

GitHub Desktopのインストール

 

https://central.github.com/deployments/desktop/desktop/latest/darwin

これを押して、ダウンロード

その後、zipなので解答して、アプリケーションフォルダに入れます

その後先ほど、登録したアカウントと、連携したます。

Sign in to GitHub.com」をクリックしましょう

ログイン情報を入力すると、次にローカルでGitを扱う際の情報を入力する画面に移動します。GitHubアカウントと同じUsernameとメールアドレスを入力してください。

次に、利用状況を送信するかの確認画面に移動します。こちらについてはどちらでも構いませんが、とくに送信する必要はありませんので、今回はチェックを外しておきましょう

そしたら、とりあえず完了です。

お疲れ様でした。

 

 

 

 

 

 

 

 

Access denied for user 'root'@'localhost' (using password: YES)

f:id:karma83:20210215125440p:plain

今回もエラー解決やっていきたいと思います。

今回はMyqlにログインができないという問題かと思います。

f:id:karma83:20210215125731p:plain

このようなエラーが起こりましたpasswordを入力しましたが間違っているようです

パスワードも覚えていないので厳しい状況です。

f:id:karma83:20210215130502p:plain

一様真横に書いて行けるらしいので、それでやって見ましたが肝心のpasswordがわからないのでどうしようもない

ググります

liginc.co.jp

このサイトを確認しました

自分がSSHをパスワードで管理しているのか公開鍵で管理しているのかもわからないので、自分がパスワードで管理していることを信じてこのサイトにあることをやっていきます

f:id:karma83:20210215132710p:plain

まさかのないという問題に直面

適当に

 sudo mysql -u root -pを打って無理やり入りました。(よくないことだと思う)

 

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';

Query OK, 4 rows affected (0.01 sec)

Rows matched: 4  Changed: 4  Warnings: 0

このコマンドを打ってパスワードを変更してみたところ

mysql -u root -pMyNewPass

Warning: Using a password on the command line interface can be insecure.

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

やっぱりだめか

とりあえずやはり

service mysqld stop

これを使えるようにしなければ

source ~/.bash_profile

を編集しないと

いけないのでしようとしたら

zsh compinit: insecure directories, run compaudit for list.

ぐぐったら

macでzshでzsh compinit: insecure directoriesの警告が出る問題 - Qiita

ここに書いてある通り

compauditに問題があるらしいので確認したところ

/usr/local/share/zsh/site-functions

/usr/local/share/zsh

この2つに問題があるらしいので

このサイトと同じエラーかもしれないので確認してみる

同じようにやって見た後

chmod 755 site-functions/ 

確認

 compaudit  

There are insecure directories:

/usr/local/share/zsh

減ってる

いけた!!

f:id:karma83:20210215141956p:plain

 mysql.service stop

zsh: command not found: mysql.service

なんで?

 

新しくprojectを立てようとしたらエラーが出た

Could not find 'nokogiri' (>= 1.5.9) among 105 total gem(s) (Gem::MissingSpecError)

Checked in 'GEM_PATH=/Users/rajakarunikarukaryouma/.gem/ruby/2.6.0:/Users/rajakarunikarukaryouma/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0', execute `gem env` for more information

多分このgemが入っていないと怒られたのだとおもう

f:id:karma83:20210215164638p:plain

bundle doctorで確認したところこんなに入らない奴らがいるぽい

gem 'bcrypt', '~> 3.1.7'

普通に入れようとしてもこのようなエラーが吐かれる

ERROR:  While executing gem ... (Gem::Com

 

無理やりあまり使いたくないけどsudoを使ってインストール

sudo gem install puma -v '3.11'

Password:

Fetching puma-3.11.0.gem

Building native extensions. This could take a while...

Successfully installed puma-3.11.0

Parsing documentation for puma-3.11.0

Installing ri documentation for puma-3.11.0

Done installing documentation for puma after 0 seconds

1 gem installed

それでもう一度bundle doctor

mandLineError)

    Unknown command bcrypt

 

The following gems are missing OS dependencies:

 * bcrypt: /usr/lib/libSystem.B.dylib

 * bindex: /usr/lib/libSystem.B.dylib

 * bootsnap: /usr/lib/libSystem.B.dylib

 * byebug: /usr/lib/libSystem.B.dylib

 * ffi: /usr/lib/libSystem.B.dylib

 * ffi: /usr/lib/libffi.dylib

 * msgpack: /usr/lib/libSystem.B.dylib

 * mysql2: /usr/lib/libSystem.B.dylib

 * nio4r: /usr/lib/libSystem.B.dylib

 * nokogiri: /usr/lib/libSystem.B.dylib

 * nokogiri: /usr/lib/libexslt.0.dylib

 * nokogiri: /usr/lib/libicucore.A.dylib

 * nokogiri: /usr/lib/libxml2.2.dylib

 * nokogiri: /usr/lib/libxslt.1.dylib

 * nokogiri: /usr/lib/libz.1.dylib

 * puma: /usr/lib/libSystem.B.dylib

 * sassc: /usr/lib/libSystem.B.dylib

 * sassc: /usr/lib/libc++.1.dylib

 * websocket-driver: /usr/lib/libSystem.B.dylib

そしたら

だめか。。。。

gem update

ERROR:  While executing gem ... (Errno::EACCES)

    Permission denied @ dir_s_mkdir - 

何かが邪魔しているのはわかるけどどうすれば?

gem install rails でハマった話 - Qiita

このサイトを見て権限がなくなった可能性を試したら何故か

いけました

rails s

それではいけるか?

f:id:karma83:20210215170835p:plain

おーーー!人生で初めてのクラッシュです。かっこいい

環境がおかしくなってきたので一度macのos

を初期化してもう一度最初からやろうと思います。環境設定も勉強になるので、それもブログとして、記載できたらなと思います

 

 

 

 

Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/rajakarunikarukaryoumanoMacBook-Pro.local.pid).

sudo mysql.server start                

このコマンドを打つとこのようなエラーがでる                                     

Starting MySQL

. ERROR! The server quit without updating PID file (/usr/local/var/mysql/rajakarunikarukaryoumanoMacBook-Pro.local.pid).

最初は

qiita.com

このサイトを使ってやってみましたが

pidを追加しても

sudo mysql.server start      するたびに消えてしまいました

そのため他の方法を試しました

qiita.com

このサイトは再インストールする方法を解説していました

これをしたら

mysql.server start

Starting MySQL

 SUCCESS! 

できました!!

rails s

で確認したところ

f:id:karma83:20210213123538p:plain

このようなエラーが返ってきました

MySQL起動エラーの対処の仕方【Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)】 - Qiita

このサイトを参考にすすめて行きます

その後bundle installしたら

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

と怒られ

【MySQL, Rails】「Gem::Ext::BuildError: ERROR: Failed to build gem native extension.」の対処 - Qiita

このサイトをみました

それでも解決ができなかったので怖いですがルビーを再インストールしようかとおもいました。

そこでまたエラーに出くわしました。

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

これはそんな難しい話じゃないらしくmacのosをアプデするたびに起こることらしいです。

blog1.mammb.com

このサイトを見て

xcode-select --install

して

xcode-select -switch <path to developer tools>
xcode-select -print-path
/Library/Developer/CommandLineTools

その後一用インストールできました。

その後bundle installが通りまして rails sで確認しました。

f:id:karma83:20210214102156p:plain

このようなエラーが悲しいエラーと戦いながら5日何が辛いかというと進んでるかどうかがわからないのが辛い毎日少しづつ解決していくしかないですね

がんばります。次回に続きます