Open50

Railsチュートリアルメモ

t_minet_mine

Railsを通してWebアプリ知識を広げたい。
Railsである理由
・日本語の情報が多い
・日本ではかなりメジャーなフレームワーク
学びたいこと
・SpringDataJPAやEntitiyFramework以外のORマッパーを使ってみたい
・Railsの認証はどういう作りになっているのか知りたい
・Railsの文化?のようなものに触れてみたい
目標
・Rubyの基礎文法をサラッと勉強
・Railsチュートリアルをサラッと通す
・Railsの認証について学ぶ
・RailsのORマッパーについて学ぶ
・簡単な認証付きCRUDアプリを作る
・学んだことを記事にまとめる

t_minet_mine

Rubyの基礎文法はサラッと一通り勉強した。
private,protectedあたりが分かりにくいなと感じた。
ミックスインは便利そうだと思った。
ビルドが不要なのは地味に便利かも。

t_minet_mine

■今の状況
Windows10にUbuntuを入れて、UbuntuにRubyをインストール済み。
Ubuntuからgithubにアクセスできるようにしている。
Ubuntuから「code .」でvscodeを開けるようにしている。

■次にすること
「第1章ゼロからデプロイまで」を進める。

t_minet_mine

ls -a ~ | grep gemと打っても何もヒットしない。
.gemrcは通常、ホームディレクトリ配下にあるらしい。

t_minet_mine
sudo apt-get install ruby-dev
sudo apt-get install build-essential
sudo gem install rails -v 7.0.4.3

よく分からんけど、railsインストールするときにruby-devとbuild-essentialが必要だった。

t_minet_mine

Bundlerのインストール
Bundlerはgemのパッケージマネージャみたいなものらしい。

sudo gem install bundler -v 2.5.6

t_minet_mine

sudo rails _7.0.4.3_ new rails_hello

を実行したらエラーが出た。

Installing psych 5.1.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/3.0.0/gems/psych-5.1.2/ext/psych
/usr/bin/ruby3.0 -I /usr/lib/ruby/vendor_ruby -r ./siteconf20240603-7163-sojfkb.rb extconf.rb
checking for yaml.h... no
yaml.h not found
t_minet_mine

code .でrailsプロジェクトのフォルダを開いてGemfileを編集しようとしたらパーミッションエラーになった。

Failed to save 'Gemfile': Unable to write file 'vscode-remote://wsl+ubuntu-22.04/home/mine/rails-practice/rails_hello/Gemfile' (NoPermissions (FileSystemError): Error: EACCES: permission denied, open '/home/mine/rails-practice/rails_hello/Gemfile')

sudo code .だとcommand not foundになった。

mine@mine-t:~/rails-practice/rails_hello$ sudo code .
sudo: code: command not found
t_minet_mine
mine@mine-t:~/rails-practice/rails_hello$ which code
/mnt/c/Users/tomon/AppData/Local/Programs/Microsoft VS Code/bin/code

ふむ。。

t_minet_mine
sudo chown -R mine:mine /home/mine/rails-practice/rails_hello

これで解決した。

sudo: スーパーユーザー(root)の権限でコマンドを実行するためのコマンドです。これにより、通常のユーザーでは実行できない操作が可能になります。
chown: "change owner" の略で、ファイルやディレクトリの所有者とグループを変更するためのコマンドです。
-R: "recursive" の略で、指定したディレクトリとそのすべてのサブディレクトリおよびファイルに対して操作を再帰的に適用します。
mine:mine: 新しい所有者とグループを指定します。前半の mine は所有者、後半の mine はグループを意味します。

t_minet_mine

Gemfileを編集して bundle install

mine@mine-t:~/rails-practice/rails_hello$ bundle install
Your Ruby version is 3.0.2, but your Gemfile specified 3.2.3

Oh...

t_minet_mine

上記の記事の方法でruby envをインストールできた。
手順が多い。。

t_minet_mine

わー

rbenv install 3.2.3
rbenv global 3.2.3
source ~/.bashrc
ruby --version
t_minet_mine

rails_helloプロジェクト作成時のRubyのバージョンが3.0.2だったのでrails_helloプロジェクトを削除

t_minet_mine

なんか消えてたのでrailsをインストールしなおした。

gem install rails -v 7.0.4.3
t_minet_mine
rails server

ブラウザでhttp://127.0.0.1:3000/にアクセスしてrailsアプリが動いていることを確認できた!

t_minet_mine
#sqlitebrowserをWSL2にインストール
sudo apt install sqlitebrowser -y

#sqlitebrowserを起動
sqlitebrowser

WSL2から起動したsqlitebrowserだとWSL2上のsqliteファイルにアクセスできた!

t_minet_mine

ほとんどのデータベースでは文字列の上限を255としている

t_minet_mine

通常、メールアドレスでは大文字小文字が区別されません。すなわち、foo@bar.comはFOO@BAR.COMやFoO@BAr.coMと書いても扱いは同じです。したがって、メールアドレスの検証ではこのような場合も考慮する必要があります

PostgreSQLはデフォルトでは大文字と小文字を区別しないらしいので、そこは大丈夫。
区別するデータベースを使う場合はActive Recordのコールバック(callback)メソッドで、登録時に小文字に変換する処理を行うらしい。

t_minet_mine

メソッドの調べ方

ri String#downcase!

結果

= String#downcase!

(from ruby core)
------------------------------------------------------------------------
  downcase!(*options) -> self or nil

------------------------------------------------------------------------

Downcases the characters in self; returns self if any changes were made,
nil otherwise:

  s = 'Hello World!' # => "Hello World!"
  s.downcase!        # => "hello world!"
  s                  # => "hello world!"
  s.downcase!        # => nil

The casing may be affected by the given options; see {Case
Mapping}[rdoc-ref:case_mapping.rdoc].

Related: String#downcase, String#upcase, String#upcase!.
t_minet_mine

RailsはRailsというオブジェクトを持っている。
デフォルトではdevelopment、test、productionの3つの環境がある。

irb(main):001> Rails.env
=> "development"

環境を指定してRailsサーバーを実行することができる。
rails server --environment production

t_minet_mine

ブルートフォース攻撃・・・総当たり攻撃

t_minet_mine

マスアサインメント
ストロングパラメータ

t_minet_mine

Rubyではnilとfalse以外のすべてのオブジェクトは、真偽値ではtrueになる

t_minet_mine

Rubyの慣習では、真偽値を返すメソッドには末尾に?を付けるのが一般的です。しかし、authenticateメソッドは特別です。このメソッドは、与えられたパスワードがユーザーのパスワードと一致するかを確認するためのものであり、その設計上、trueまたはfalseではなく、ユーザーオブジェクトまたはfalseを返します。

t_minet_mine

セッションハイジャック攻撃とは、攻撃者があるユーザーのセッションidのコピーを手に入れて、そのユーザーとしてログインするという攻撃方法です

t_minet_mine

<meta name="viewport" content="width=device-width, initial-scale=1">

width=device-widthを指定することで、画面の幅をデバイスの幅に設定してくれる。
このmetaタグを設定しない場合、デスクトップブラウザではデバイスの幅に合わせて画面の幅を調整してくれるが、モバイル端末のブラウザでは980pxくらいの幅になってしまう。
そのため、このmetaタグを設定して、画面の幅をデバイスの幅に一致させる必要がある。

t_minet_mine

クッキーの有効期限がSessionとなっている。
これは、ブラウザが閉じられるまでがクッキーの有効期限ということらしい。