railsの学習(1日目)とRubyの学習(2日目)とLinuxの学習(7日目)とプロになるためのweb技術入門(5日目)
今日は会社を有給で休んだが勉強にも時間を割きたい
さてまずはRubyの勉強するぞ!と言いたいがなぜかprogateのレッスン選択を間違えてrailsの勉強をやってしまった。。。
まぁいずれ通る道なのでよし。Rubyも少しやった
データベースとは
データベースとはデータを保存しておく場所のこと。このデータベースを参照し呼び出すことでwebアプリケーションに組み込めるということだろうか。
投稿一覧ページを作成しよう
Posts コントローラを用いて投稿に関するページを作成する。
一覧ページを作成する時は、index(索引)というアクション名を使用することが一般的なので、indexアクションを用意する。また、「rails generate controller」は「rails g controller」と省略することができる。
変数を使っての表示
HTMLのままではデータベースに接続できないため、投稿内容をRubyの変数に代入することで接続させる。
index.html.erbのようなerbという形式のファイルでは、<%%>で囲うことでHTMLファイルの中にRubyコードを埋め込むことができる。「erb」とは「Embedded Ruby(埋め込みRuby)」の略であり、Rubyを組み込まれたHTMLですよ、という意味になる。
埋め込みRubyの表示
埋め込みRubyを表示するには<%= %>で囲うことで可能になる。つまり、<%%>で囲うときは表示されないため、変数の定義などで用いられる。そして<%=%>はコードの中身が表示されるので、変数の値などをブラウザに表示したいときに用いる。
each文での表示
変数ごとにいちいちHTMLと変数を記入していたらキリがないため、1.それぞれの変数を一つの配列にまとめて、2.each文を用いて一つずつ取り出す、という処理を行う。
画像のように変数postsと用意し、配列を作っていく。このとき、[]のなかは配列のため、文字列ごとに,(カンマ)で区切ることを忘れないように。
each文
下の画像では配列postsから要素を1つずつ取り出して変数postに代入し、表示している。こうすることで、postsの要素の数だけeach文の中身が実行されるので、投稿の数だけHTMLを書く必要がなくなる。<% end %>も忘れないように。
アクションでの変数の定義
これまではviewファイル内で変数を定義してきたが、Rubyではアクションファイル内で変数を定義するのが一般的(上の方でやった rails generate controller post indexで作ったposts_controller.rbがアクションファイル)。「def index」と「end」の間で変数を定義することで、その変数をindex.html.erb内で使用することができる。
@変数
通常、アクションファイル内で定義した変数をビューファールで表示することはできないが、@postとすることで呼び出しが可能になる。
データベースの用意
データベースにはテーブルという概念があり、その中にカラム(列)がある、横の行にテーブルがある。
データベースにデータを保存するためにはまずテーブルを作成する必要がある。データベースに変更を加えるには、1.データベースに変更を指示するファイルを作成する。
2.データベース変更の指示を与える。という手順がある。
テーブルの作成
そのためにマイグレーション【migration】(移動、乗り換えという意味)と呼ばれるデータベース変更のためのファイルを作る。マイグレーションファイルは「rails g model Post content:text」というコマンドで作成することができる。Postという単数形にすること。このテキストにはデータ型に分類され長文が入る。ちなみにモデルとはマイグレーションファイルファイル内に作られるApplicationRecordを継承したクラスのことである。コードでは以下の文になる。class Post < ApplicationRecord
先ほどのコマンドを実行すると、下の図のようにdb/migrateフォルダの下にマイグレーションファイルが作成される。
要は変更指示用のマイグレーションファイルを作る必要があり、それがrails g model Post content:textで作れるということである。
そしてこのマイグレーションファイルを実行するために「rails db:migrate」をターミナルで実行することでテーブルが作成される。
テーブルへのデータ保存
rails console
これをターミナルで打ち込むことでrubyのコードを簡単に実行できる環境が作られる。
データベースを保存するにはまずPostモデル(設計図、クラス)の.newインスタンスを作って、それを保存する必要がある。コードとしては「post = Post.new(content: "文字列")」となる。この.newの部分がインスタンスとなり、()内でその内容を定める。
そしてそれをpost(変数名).saveでデータベース上に保存できる。これはpostがApplicationRecordを継承したPostモデルを元に作られたインスタンスだからである。
データベースからの取り出し
rails consoleを起動し、「変数 = モデル.first」(下の画像ではpost = Post.first)でデータベースの一つ目のデータを取り出すことができる。
また変数postが定義されている状態で「post.content」と打ち込むことでデータベースの最初の投稿内容が表示されるので、データベースから投稿内容が取得できていることがわかる。
全てのデータを取り出す
全てのデータを取り出す場合はposts = Post.allで可能になる。これはfirstがallに変わっただけなのでわかりやすい。
テーブルの中から任意のデータだけを取得する場合はposts = Post.all(id)で取り出すことができる。
配列のデータから投稿内容を取り出す。
posts = Post.all(0)で取り出したデータはposts = Post.all(0).contentでcontent(投稿内容)の0番目のデータを取り出せる。
データベースの表示
これまでデータベースの作成と保存、呼び出しについて学んだが、次はそれを実際に表示できるようにする。
まずはindexアクション内の@postsに取得したデータを代入し、ビュー内ではeach文で繰り返し処理する部分に代入し、繰り返し実行する。表示部分はpost.contentになっている。
Ruby
each文(繰り返し処理)
配列.each do |変数名|と書き、endまでの間に実行したい処理を書く。
each文は変数の中にインデックス0から順番に繰り返し処理されていく。変数名に決まりはないが、単数名にするのが普通。
もちろんeach文の中に変数を使わないputsu処理も繰り返し処理できる。下の画像では------も繰り返し処理されている。
ハッシュ
ハッシュとは配列と同じで複数の値を管理するものだが、値に対してキーという名前をつけて管理する。もちろん配列と同じように変数に代入し、出力もできる。JavaScriptのオブジェクト(値とプロパティ)に近いかも?
ハッシュの更新は変数の定義の下に変数名["キー"] = 代入したい値として新たな値を代入するだけ。
ハッシュの追加は変数名["キー"] = 更新したいキーとなる。
web
情報はパケットという単位に分割されて送受信されている
パケっその送受信はTCP/IPが責任を持って行っている(TCP/IPとは郵便配達における郵便局のようなもの。IPアドレスを元に任意のホストに情報を届ける)。
IPアドレスによって通信相手のコンピュータは特定できるが、URLにはそんな数字はない。つまりURLのドメイン名からIPアドレスに変換する仕組みがあるということであり、それがDNS(Domain name System)と呼ばれるものである。このDNSサーバーをインターネット上に配置し、それにドメイン名を問い合わせればIPアドレスが判明するというわけである。
シェルでは最初にコマンドを打ち込まなければいけない。ファイルを最初に打ち込むとシェルがそれをコマンドだと思って探してしまい、エラーが出てしまう
入力リダイレクトを使うことで複数回同じ処理を行い際にもミスがなく楽にこなせる
また出力先がファイルになることで端末画面に映らななくらいのデータも記録して残してあとで眺めるということもできる
しかもUnixはデバイスもファイルとして認識するのでプリンタや記憶装置にもコマンドの出力を直接渡すことができる。
パイプとはコマンド相手に直接入出力できる機能で、記号「|」は名前の通りパイプの形をしている。入出力リダイレクトで作る中間ファイルがいらないので容量を食わないし処理が高速になる。
このパイプやリダイレクトで切り替えられる入出力のことを標準リダイレクトと言い、入力部分を標準入力、出力の部分を標準出力と呼ぶ。
パーミッション=許可 ファイルごとに読み取りや書き取りが可能かどうかが設定されている。rやw、xが読み込みや書き込み、実行のパーミッションで、コマンドで付与したり消したりできる。これはchmod (change mode)のコマンドで操作可能
このパーミッションファイルを操ることで誰にも、そして自分にも操れなくすることでミスを防ぐ使い方もある
他にもあるディレクトリの中の特定のファイルだけコピーしたくない、というときも、読み込みの権利を剥奪すれば、それ以外のコピーも可能になる。
Root = 管理者 /のルートディレクトリとは別の概念。どちらの意味かは文脈で判断するしかない
管理者と一般ユーザーは操作している人物が同じでもユーザーとしては別物として扱う。常に管理者としてコンピュータを操作すると何らかのミスで重要なファイルを破壊してしまうこともあるからである。
このような人はミスするものだという前提に立ったシステムもLinuxの文化と言える
Rootでないと操作できないコマンドは、sudo(switch user and do ユーザーを切り替えて実行)を行えばできるようになる
アップデートは本でいうところの誤植などの修正版、バージョンアップは内容の大きな書き換えを行ったもの