【未経験プログラミング】Railsのタスクアプリを作成する。【21~3日目】
①rails new tasklist --database=mysql --skip-test でrailsプロジェクト作成
→新規作成とデータベースを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はRailsはTaks クラスにコードが無くてもモデル操作できるようになっています。
rails/base.rb at c644e8ba99204a44ea21afbbd877792f6a09ea74 · rails/rails · GitHub
つまりRailsはActiveRecordと呼ばれるライブラリを利用することで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 →ステータスカラムが追加された。
>
は、 >
を 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もある。
URLとHTTPメソッドを受け取ってControolerにわたすのがRouter
リソース(データ)として振る舞うのがModel
Modelを表示整形する雛形がView(多くはHTML)
ModelやViewを制御するのがController。
rails new プロジェクト名:今回はmessage-boardを作成
Bundler とは、 Ruby や Rails のプロジェクトで使用するライブラリの管理ツール
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 過去のコミット履歴を確認。
保存先=リポジトリ
ワークツリーとインデックス
ワークツリー=Gitでバージョン管理されているフォルダ内のこと。
ステージした後にコミットするとバージョンが1つ進む。
インデックスの役割
コミットを行う前にワークツリーの変更箇所の中から関連性のある変更のまとまりを選択する重要な役割がある。
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
のレコードが実際に保存されていることを確認できたと思います。