【未経験プログラミング】Railsのタスクアプリを作成する。【21~3日目】

rails new tasklist --database=mysql  --skip-testrailsプロジェクト作成 

→新規作成とデータベースをmysqlに指定。

②初期化:git init リポジトリのコミットをする。git add . とgit commit -a

git push origin master でプッシュして反映

 MySQL サーバを起動:sudo service mysqld start

④$ rails s -b $IP -p $PORT でrails serverのpumaが起動される。③が起動してないとエラーが出る。

⑤データベースを作成。 rails db:create

 

※同じテーブルが作成済み

ActiveRecord::Migration.drop_table(:likes)

コンソールでテーブル削除

Created database 'message-board_development' 

 Created database 'message-board_test'

 ※YAML(.yml)ファイル:キー:値のペアで記述される。設定ファイルで利用される。

⑥Modelを作成する :rails g model Tasklist content:string tasklistというモデル作成

作成された:20180912101243_create_tasks はテーブルを管理するファイル

マイグレーションファイルはSQLのCREATE TABLE・・と一緒です。

Railsからデータベースを管理します。テーブル/カラム 作成削除。

rails db:migrate マイグレーションを実行。

⑧describe tasks;でマイグレーション確認できる。

⑨モデルクラスの作成

app/models/application_record.rbとapp/models/message.rbを確認。

class Task がApplicationRecordを継承して ApplicationRecordをActiveRecord::Baseをさらに継承している事がわかる。(Task<ApplicationRecord)

ActiveRecord::BaseはRailsTaks クラスにコードが無くてもモデル操作できるようになっています。

rails/base.rb at c644e8ba99204a44ea21afbbd877792f6a09ea74 · rails/rails · GitHub

つまりRailsActiveRecordと呼ばれるライブラリを利用することでSQLを書く必要なくCRUD操作ができる。

⑩task = Task.new(content: 'kadai') taksにTaskモデルのインスタンスが代入されインスタンスは:#<Task id: nil, content: "kadai", created_at: nil, updated_at: nil> となっている。

⑪task.save セーブ 修正 task = Task.first → taskcontent = '修正したい’

⑫レコードを追加で2個作る合計3個

⑬Git git status diff add .   commit -m 'task model'

----------------------------RouterとControllerとViewの関係------------------------------------

  • Routerは、URLのルーティングを一元管理してる
  • Controllerは、HTTPリクエストの処理を担っている
  • Viewは、HTTPレスポンスとして返されるWebページ

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

⑭config/routes.rbのコード resources :tasks追加する。

Routerの設定:resources:tasks でCRUDの基本7つのルーティンを省略して記載したことになります。

RESTful:(index, show, new, create, edit, update, destroy)

⑮コントローラーを作成 モデル名Sで作成 継承関係はモデル欄確認

 HTTPリクエス

rails g controller Tasks --no-helper --no-assets

⑯コントローラー内とルーティンを同じ名前のメソッド名で定義する。

class TasksController < ApplicationController
def index
end

def show

@task = Task.find(params[:id]) #IDが取得できるように。
end

def new
end

def create
end

def edit
end

def update
end

def destroy
end
end

⑰Viewの作成 HTTPレスポンス

ルーティンの中で必要なViewファイルはgetメソッドだけ、理由はgetメソッド以外はページの表示ではなくリソース操作の為。

app/views/task/index.html.erb

indexアクションに対応するViewを編集。Contorollerから渡されたデータ@tasksを一覧表示させる。

<h1>タスク一覧</h1>

<ul>
<% @tasks.each do |task| %>
<li><%= task.content %></li>
<% end %>
</ul>

Controllerから渡された@taskレコード郡を@task.eachで1つずつtaskとして取り出し<%= task.content %>によってcontentカラム値を表示します。

 

カラムを増やす

rails g migration AddStatusToTasks status:string

 rails db:migrate  →ステータスカラムが追加された。

 

&gt; は、 > を HTML で表示させるための記号

 

 

 

 

【未経験プログラミング】Railsの基本【22日目】

Controller の生成コマンド:rails g controller コントローラー名(messages)

app/controllers/messages_controller.rb と app/views/messages が生成される。

→message_controller.rbを見ると、essagesController クラスが ApplicationController クラスを継承しているだけのコードが記載、

application_controller.rb を確認

class ApplicationController < ActionController::Base 継承関係がわかる。

 

・index.html.erb :railsに対してERBファイルがHTMLファイルへと変換されると示している。

 HTML を書くときに必ず共通する部分が現れます。それは、 <!DOCTYPE html> や head内の各要素。Railsは手軽にできる。

csrf_meta_tags :セキュリティ対策用のコード

stylesheet_link_tag ... :CSS を読み込むためのコード

javascript_include_tag ...:JavaScript を読み込むためのコード。

body要素内の <%= yield %>:yieldは

Runyコードによって、body要素に埋め込まれたページが切り替わる。(つまりbody要素内)に index.html.erb や show.html.erbなどの各ページの内容が代入されると考えてください。

 

RESTful:7アクションindex, show, new, create, edit, update, destroy

 

【未経験プログラミング】Railsの基本【21日目】

Webアプリケーションは CRUD(POST,GET,PUT,DELETE)を使って操作できるアプリケーションの事。

Webアプリケーションのフレームワークとは、土台となるプログラム。ユーザーの書いたプログラムを呼び出す側。ライブラリはユーザーの意思で取り出す便利なプログラムだが、フレームワークはユーザープログラムはルールに沿ってプログラムが動くもの。

 

MVC:Model View Controller という役割分担

Ruterもある。

https://techacademy.s3.amazonaws.com/bootcamp/webapp/message-board/mvc_rails.png

URLとHTTPメソッドを受け取ってControolerにわたすのがRouter

リソース(データ)として振る舞うのがModel

Modelを表示整形する雛形がView(多くはHTML)

ModelやViewを制御するのがController。

 

rails new プロジェクト名:今回はmessage-boardを作成

Bundler とは、 RubyRails のプロジェクトで使用するライブラリの管理ツール

 

 

 

gyazo.com

NoMethodError in Users#likes

undefined method 'name' for nil:Nilclass

→ネームメソッドない

 

実装されていなくても表示される。TOP画面等

Users/likes.html.erb

users_controller

定義なしの為nilで帰ってきた。

 

def likes

@user = User.find(params[:id])
@microposts = @user.microposts.page(params[:page])

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【未経験プログラミング】Rubyのおさらい【20日目/21日目】

integrer = 1.to_s 文字列  "1"

strings = 1.to_i  数値  1

 

puts '#{1+1}' =#{1+1}   Rubyの式として評価しない
puts "#{1+1}" =2   Rubyの式として評価

省略 %w(#{1+1}) =#{1+1} 

           %W(#{1+1}) =2

1と'1'は数値と文字列で別の解釈

irb p 1 p'1' 

1.class  integer

'1'.class String

pメソッド 主にテスト用途で使用。データの種類がわかりやすい。

putsメソッド 単に画面に表示して改行する用途で使用。

データの種類 integer(10),float(10.1),String('10'),Class(String),

                         True class/false class(true),hash(#),Array([]),nillclass(nil)

 

animals = ['dog', 'cat', 'mouse']
animals << 'cats'
p animals => ["dog", "cat", "mouse", "cats"]

 

animals = ['dog', 'cat', 'mouse']
p animals[2]  =>  "mouse"

 

animals = ['dog', 'cat', 'mouse']
animals[2] = 'human'
p animals   => ["dog", "cat", "human"]

 

animals = ['dog', 'cat', 'mouse']
animals.delete('cat')
p animals  => ["dog", "mouse"]

 

animals = ['dog', 'cat', 'mouse']
animals.insert(2,'bird')
p animals  => ["dog", "cat", "bird", "mouse"]

rubyの配列要素は[要素1,要素2,要素3]で表現します。

 

ハッシュ{} = 連想配列 {}=波括弧

 

child = {height: 150, weight:50}
child[:age] = 7   キーと値

p child
p child [:age]

=>

150
50
{:height=>150, :weight=>50, :age=>7}
7

 

child = {height: 150, weight:50, age:5 }
child.store(:age, 7)

p child => {:height=>150, :weight=>50, :age=>7}

 

%記法

%w(文字列式展開無) ,%i(シンボル式展開無),%W(文字列式展開有) ,%I(シンボル式展開有)

"dog"  :dog

 クォーテーション、カンマ、コロン、など省略できる。.

 

a = %W(#{1+1} #{1+2})
p a =>["2", "3"]

 

a = 0
if a == 1
p 'aに1が代入されていたら実行される。'
else
p 'aに1が代入されていなかったら実行される'
end  =>    "aに1が代入されていなかったら実行され

 

 

 

【未経験プログラミング】Gitの基本【20日目】

①Git 追加されたファイルや文字があればgit statusで見ると赤く表示される。

②git add  ファイル名(git add sample.txt)すると更新されたファイルはステージします。

③コミットします。 git commit

④nano起動するのでコメントを入れる、ctrl+x で保存 Y enter

 

Gitのコマンド

git init 現在のフォルダ内にリポジトリを作成し、ワークツリーとインデックスを用意。

git add ファイル名 :新規追加や変更されたファイルを選択し、ステージさせる。

git commit ステージされた変更をコミットする。

git status:ファイル単位で確認する。

git dff ワークツリーとインデックスを比較して、差分表示

git log 過去のコミット履歴を確認。

 

保存先=リポジトリ

リポジトリは2種類 ローカルリポジトリ、リモートリポジトリ

 https://techacademy.s3.amazonaws.com/training/github/basic/git_repository_figure.png

ワークツリーとインデックス

ワークツリー=Gitでバージョン管理されているフォルダ内のこと。

ステージした後にコミットするとバージョンが1つ進む。

https://techacademy.s3.amazonaws.com/training/github/basic/git_index_figure.png

インデックスの役割

コミットを行う前にワークツリーの変更箇所の中から関連性のある変更のまとまりを選択する重要な役割がある。

 

ローカルリポジトリでの変更をリモートリポジトリへ反映した。

git remote add origin リモートリポジトリURL:ローカルリポジトリにリモートリポジトリを登録する。

git remote -v:ローカルリポジトリに登録されたリモートリポジトリの一覧を表示する

git push origin master:登録したリモートリポジトリへプッシュする

originとは

自分のローカルリポジトリと同じリモートリポジトリをoriginという名前にする習慣。

理由はgit cloneをすると自動でoriginとなる為。

 

 

【未経験プログラミング】Ruby+mySQLの基本【19日目】

おさらい

form action="/" method="POST"

form で送信フォームを表示させる。

action formで送信されたデータの送信先 この場合はTOPページ(/)

metod 必須ではない属性 転送先を指定する。 postとgetがある。

get :<form action="cgi.php?name=pippi&old=21&address=tokyo" method="get">

例: http://www.hogehoge.com/cgi.php?name=pippi&old=21&address=tokyo

post

post:form action="cgi.php?name=pippi&old=21&address=tokyo" method="post"

postに指定すると入力したフォーム内容はURIとは別の場所に保管されてデータが保存される。

入力データは外側から見れないから安全性が高い。

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

getには送信するデータ量の制限がある

getは送信したデータ内容が送信先のサーバーにログとして残ってしまうことがあるpostには送信するデータ量の制限がない

一概には言えないがgetはサーバー側にあるデータの取得に適している

一概には言えないがpostはユーザー側が情報を送信するのに適している

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

 

 

 

【未経験プログラミング】Rubyの基本【18日目】

 mysqlサーバーのスタート:sudo service mysqld start

ステータつ確認:sudo service mysqld status

止め方:sudo service mysqld stop

サーバーへの接続:mysql -u root

文字化けの確認:show variables like "chara%";

データベースを作成:CREATE DATABASE データベース名;

データベース一覧を見る:show databases;

データベースの削除:DROP DATABASE データベース名;

操作するデータベースを選択:USE データベース名;

データベースのテーブル一覧を見る。:show tables;

テーブルの作成:CREATE TABLE データベース名.作りたいテーブル名 (

                            id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,

                            title VARCHAR(100),

                             price,INT,

                            created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

 

(....):id title price created_at(登録された日時)というカラムを作成するコード

id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,はidというカラムを作成しAUTO_INCREMENTで1から始まり次は2,3、と値が1ずつ増える設定。

NOT NULLはからのデータは許さない。

PRIMARY KEYはデータを一意に得手薄ためのカラムで1つのテーブルに必ず1つは必要。

title VARCHAR(100)はtitleというカラムをVARCHAR(100)データ型で保存する設定。

VARCHAR(100)VARCHARは文字列であり(100)は100文字と制限するためのもの。

price INT はpriceカラムをINT型で作成する。

created_at カラムをTIMESTAMPと言う日付型データで保存し空きは認めず、DEFULT CURRENT_TIMESTAMPはデフォルト値として現在日時を保存。

created_atは保存時にわざわざ現在日時を与えなくても、データ保存と同時に自動的にそのときの現在日時を保存してくれます。という意味です。

+------------+--------------+------+-----+-------------------+----------------+
| Field      | Type         | Null | Key | Default           | Extra          |
+------------+--------------+------+-----+-------------------+----------------+
| id         | int(11)      | NO   | PRI | NULL              | auto_increment |
| title      | varchar(100) | YES  |     | NULL              |                |
| price      | int(11)      | YES  |     | NULL              |                |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+------------+--------------+------+-----+-------------------+----------------+

テーブル削除:DROP TABLE データベース名.テーブル名;

INSERT構文

INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);

カラム1と値1が対応している。

上記テーブルだと

INSERT INT bookstore.books (title,price,) VALUES (はじめてのMYSQL,500);

+----+----------------------+-------+---------------------+
| id | title                | price | created_at          |
+----+----------------------+-------+---------------------+
|  1 | はじめてのMySQL      |  2980 | 2016-11-07 06:20:12 |
+----+----------------------+-------+---------------------+

となります。

mysql> SELECT * FROM bookstore.books; :データを取得する。(見る)

UPDATE テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);で上書きします。

DELETE DROP テーブル名 :削除します。

*と書くと全てのカラムを取得することができます。これで、先ほど保存したはじめてのMySQLのレコードが実際に保存されていることを確認できたと思います。