PowerPoint プレゼンテーション

資料ダウンロード
• http://sasoonware.com/file/
第5章モデルクラスについて
目次
5-1.モデル利用のプロジェクトを作ろう
5-2.マイレグレーションとシード
5-3.アプリケーションの実行からデプロイまで
5-4.モデルの基本操作を覚えよう
5-5.基本の検索を覚えよう
5-1.モデル利用のプロジェクトを作ろう
5-2.マイレグレーションとシード
5-3.アプリケーションの実行からデプロイまで
5-4.モデルの基本操作を覚えよう
5-5.基本の検索を覚えよう
DB設定
database.ymlにDB設定を記述
models
views
app
contorollers
その他
色々…
myapp
migrate
db
その他色々…
その他
色々...
config
daatabase.yml
因みに、database.yml.sample というファイルが生成されているので、
それをコピって作る
このファイル!
DB設定記述
# SQLite version 3.x
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3‘
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
開発モードの設定
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
テストモードの設定
dapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000
リリースの際の設定
使用するDBの種類
によって記述が違う
ので、その辺りはテ
キスト参照
命名規則
・モデルのファイル名
コントローラーファイルからコントローラーを抜いたもの
例:
コントローラーが
sample_contoroller.rb
だったら
sample.rb
になります。
基本全て小文字。
モデルのクラス名
クラス名は、ファイル名の最初の一文字が大文字になったもの
先程の例だと、
sample.rb
ファイルのクラス名は
Sample
基本的に全て単数系
Samplesとか、samples.rbとかは作らない
勝手に生成してくれる
実際に作ってみよう
1.コマンドで作る
rails generate model sample name:string age:integer mails:string tel:string
モデル名の後に持ってる要素の変数名:型を書いていく
5-1.モデル利用のプロジェクトを作ろう
5-2.マイレグレーションとシード
5-3.アプリケーションの実行からデプロイまで
5-4.モデルの基本操作を覚えよう
5-5.基本の検索を覚えよう
ここから大事
モデルを作成すると、3種類のファイルができる
1.スクリプトファイル
sample.rb モデル本体
2.テスト関係のファイル
testフォルダ内に入っているテスト用ファイル
ここでは気にしなくてよい
3.マイグレーションファイル
データベースの更新を行うためのファイル。
マイグレーションを行うために必要
マイグレーションとは?
予めRailsにデータベースに関する記述を行うことで、Railsからデータベースの
テーブルを自動生成する機能
通常の開発
1.データベースのテーブルを作成
2.データに合わせて処理を作成
Rails
1.必要なモデルを作成
2.モデルに対応したテーブルを自動生成
メリット
1.SQLを使わなくてよい
2.「やべ、必要なテーブルがねぇ!」が起こらない
例
sampleモデルを作ったら
models
sample.rbが作
成される
views
app
contorollers
その他
色々…
myapp
migrate
db
その他色々…
その他
色々...
○○_create_samples.rbが作成さ
れる(○○は作成年月日時分秒)
migrate ファイルの中身
デフォルト状態
class CreateSamples < ActiveRecord::Migration
def change
end
end
※コマンドプロンプトで作成した場合はデフォルトで記述済み
記述後
class CreateSamples < ActiveRecord::Migration
def change
create_table :sample do |t|
t.string :name
t.integer :age
t.string :mail
t.string :tel
t.timestanmp
end
end
※Exo IDeの場合
書き方が少し違う
疑問点
tって何?
余り深く考えずにマイグレーションの文法みたいなものr
(らしい)
timestampsは?
恐らくcreated_atカラム、updated_atカラムの生成を行っ
ている
マイグレーションの実行
models
views
app
contorollers
その他
ここに移動
色々…
myapp
migrate
db
その他色々…
その他
色々...
rake db:migrate
を実行
データベースを確認
データベースmyapp内
samplesテーブル
id
integer
autoincrement
name
string
age
integer
mail
string
tel
string
created_at
timestamp
(作成日)
updated_at
timestamp
(更新日)
primary
シードファイル作成
シードとは?
予めテーブル内に入れておく値
models
views
app
contorollers
その他
色々…
myapp
migrate
db
seeds.rb
その他
色々...
その他色々…
このファイルに記述
記述例
sample.rb内
Sample.create(
name: ”yoshimura”,
age: 23,
mail: “[email protected]”,
tel: “090-9999-9999”)
モデルクラスの持つ、createメソッドを利用する為の記述
シード作成
models
views
app
contorollers
その他
色々…
ここに移動
myapp
migrate
db
seeds.rb
その他
色々...
その他色々…
rake db:seed
を実行
実行結果
sampleテーブル内
id
name
age
mail
tel
created_at
updated_at
1
“yoshimura”
23
“satoshi.yosh “090-9999-9999”
imrua.so@g
mail.com”
2013-08-24
10:30:30
2013-08-24
10:30:30
データが挿入されている
どんな使い方をするのか?
都道府県や銀行コードのような予め値が決まってい
るカラムに便利!
カテゴリなどをデータベース内に定義する場合や、
初期ユーザーは管理者として扱うことが決まってい
る場合などにも使える
5-1.モデル利用のプロジェクトを作ろう
5-2.マイレグレーションとシード
5-3.アプリケーションの実行からデプロイまで
5-4.モデルの基本操作を覚えよう
5-5.基本の検索を覚えよう
コントローラーで全レコードを取り出す
※styleseetの問題なので<table>用のスタイルを追加しようは割愛
app/contorollers/
sample_contoroller.rb内
#config: utf-8
class SampleContoroller < ApplicationContoroller
layout “mylayout”
def index
@title = “this is Index Page.”
@datas = Sample.all
end
end
表示:全体のレイアウトの修正
index.html.erb
models
sample
_mydata.html.erb
views
app
layouts
mylayout.html.erb
contorollers
このファイル!
その他
色々…
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
コントローラーからの値を用いた表示
body部分を修正
<body>
<%= render “partial/myheader” %>
<%= yield %>
<%= render “partials/myfooter” %>
</body>
<%= yield %>内に、
アクションから呼び出され
たテンプレートが作成する
HTMLコンテンツが埋め込
まれる。
indexページに値を表示する
index.html.erb
models
sample
このファイル!
_mydata.html.erb
views
app
layouts
contorollers
その他
色々…
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
mylayout.html.erb
データベースからとってきた値表示
<% @datas.each do |data| %>
~
<table>
<% @datas.each do |data| %>
<tr>
<td><%= data.name %></td>
<td><%= data.age %>></td>
<td><%= data.mail %>/<td>
<td><%= data.tel %></td>
</tr>
<% end %>
</table>
<% end %>
間の処理をdata分繰り返す
パーシャルを利用
app/views/index.html.erbを編集
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
<th>Mail</th>
<th>Tel</th>
</tr>
<%= render :partial => “partials/mydata”, :collection => datas %>
</tables>
head部だけ表示して、データ部分はパーシャルで受け取る
どのファイル?
index.html.erb
models
sample
views
layouts
contorollers
partials
mylayout.html.erb
app
その他
色々…
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
_mydata.html.erb
このファイル!
パーシャルに記述
<tr>
<td><%= mydata.id %></td>
<td><%= mydata.name %></td>
<td><%= mydata.age %></td>
<td><%= mydata.mail %></td>
<td><%= mydata.tel %></td>
</tr>
中身を記述
イメージ
モデル
Sample
コントローラー
@datas = Sample.all
データを取り出す
ビュー
データを
渡す
データを取り出す
レイアウト
(大きな見た目)
パーシャル
DB
レイアウト
パーシャル
パーシャル パーシャル
(見た目の部品)
5-1.モデル利用のプロジェクトを作ろう
5-2.マイレグレーションとシード
5-3.アプリケーションの実行からデプロイまで
5-4.モデルの基本操作を覚えよう
5-5.基本の検索を覚えよう
モデルの基本操作
1.allメソッド
smp = sample.all
サンプルテーブルの中身全部が変数smpの中に入る
smp.name
or
smp[“name”]
でnameカラムの値をとり出せる
レコードの新規作成
Rails上で吉村智志という人物を作成するには?
1.クラスを作成
Yoshi = sample.new ( :name => “吉村智志” , :age 23 , :mail => “taro@yamada” ,
:tel => “090-6811-1291” )
さっき作った
モデルクラス
これで値を持つクラスが作成される
2.データベースに保存
Yoshi.save
フォームでレコードを作成する
models
layouts
mylayout.html.erb
sample
index.html.erb
views
app
contorollers
このファイル!
その他
色々…
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
入力フォームはHTMLで普通に書く
views/index.html.erbに書き加える
<form>
<input type=“text” name=“name” >
...省略
</form>
(同じ入力フォームを何度も使う予定なら、パーシャルにしちゃった方が良い。)
//////////////////////////////////////////////
!!POSTの値を受け取るときにはroutes.rbに
post “sample/index”
を追記
(結構忘れやすそう)
DB保存までにコントローラーが
やること
Postした値を受け取る
if request.post? then
obj = Sample.new(
:name => params[‘name’],
ポストリクエストだった
場合
:age => params[‘age’].to_i,
受け取った値で
:mail => params[‘mail’],
モデルを生成
:tel => params[‘tel’]
)
obj.save
生成したモデル
をDBに保存
レコード操作の第1歩
IDでレコードを検索、表示
一覧から詳細へ
一覧画面
<tr>
<td><%= mydata.id %></td>
<td><%= mydata.name %></td>
<td><%= mydata.age %></td>
<td><%= mydata.mail %></td>
<td><%= mydata.tel %></td>
<a href=“/sample/show?id=<%=mydata.id %>”>
</tr>
一覧画面へのリンク
リンク先URL例 myapp/sample/show?id=1
クエリで送られたIDを基にレコードを
検索
1.コントローラーを修正
一覧表示の為のアクションを記述
sample_controller.rb
def show
@result = Sample.find(params[:id])
end
Sampleテーブルのidのレコードを取得
クエリ文字列で取り出した値をID番号として渡している
検索結果を表示するVIEWを用意
layouts
mylayout.html.erb
models
index.html.erb
views
sample
app
contorollers
その他
色々…
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
show.html.erb
作成!
受取のview
<%= @result.id %>
<%= @result.name %>
<%= @result.age %>
<%= @result.mail %>
<%= @result.tel %>
<%= @result.created_at %>
<%= @resullt.updated_at %>
※
アクションを生成したら
・アクション ・ビュー ・routes.rb
の三つは同時に更新することが多い
Railsでレコードの削除
モデルクラス.destoroy
例:
@sample = Sample.find(1)
@sample.destoroy
でSampleテーブルでidが1のレコードを消去
条件指定消去
@sample.destoroy_all(created_at > '2013-08-24')
で今日以後に作ったレコードすべて消去
ここから先はさっきとほとんど一緒
一覧から消去へ
一覧画面
<tr>
<td><%= mydata.id %></td>
<td><%= mydata.name %></td>
<td><%= mydata.age %></td>
<td><%= mydata.mail %></td>
<td><%= mydata.tel %></td>
<a href=“/sample/show?id=<%=mydata.id %>”>
<a href=“/sample/delete?id=<%=mydata.id %>”>
</tr>
デリートアクション用のページへ。クエリーでidを指定
js部分は省略
デリート用のアクションを用意
コントローラー
def delete
obj = Sample.find(params[:id])
obj .destroy
redirect_to :action => “index”
end
※削除はコントローラでやってしまう。
本ではindexに戻していたが、
「削除されました」
を表示するビューを作っても良い
※routes.rb
get “sample/delete”
も忘れずに
次は更新
実はSaveメソッドは更新も兼ねている!
例:一覧→入力→更新を行うh
一覧画面index.html.erb
<tr>
<td><%= mydata.id %></td>
<td><%= mydata.name %></td>
<td><%= mydata.age %></td>
<td><%= mydata.mail %></td>
<td><%= mydata.tel %></td>
<a href=“/sample/show?id=<%=mydata.id %>”>
<td><a href=“/sample/update?id=<%= mydata.id %>”></td>
</tr>
入力画面へのリンク
入力画面
mylayout.html.erb
layouts
models
index.html.erb
views
sample
app
その他
contorollers
その他
update.html.erb
色々…
作成!
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
入力用HTML
<table>
<form method=“post” action=“/sample/update”>
<tr>
<input type=“hidden” name=“id” value=“<%= @result.id %>”>
<th>Name</th>
<td><input type=“text” name=“age” value=“<%= @result.age %>”></td>
</tr>
他Age等省略...
<input type=“submit” value=“送信”>
</form>
</table>
本ではIDも書いてたけど、
IDの存在はなるべくユーザに見せない方が良い
(連番なので、会員数とか見せたくない場合とか。その場合URL
も変えなきゃだめだから、全部hiddenで送る?)
コントローラーで値受け取って更新
models
views
app
contorollers
その他
色々…
myapp
migrate
db
seeds.rb
その他色々...
その他色々…
sample_controller.rb
更新アクションを追加
def update
@result = Sample.find(params[:id])
if request.post? then
@result.name = params[‘name’]
@result.age = params[‘age’].to_i
@result.mail = params[‘mail’]
@result.tel = params[‘tel’]
@result.save
redirect_to :action => “index”
else
@title = “Update ID” + params[:id]
end
end
※同じようにindexではなく、更新完了ページに飛ばしても良い
忘れずにroutes.rbを更新
get “sample/update”
post “sample/update”
5-1.モデル利用のプロジェクトを作ろう
5-2.マイレグレーションとシード
5-3.アプリケーションの実行からデプロイまで
5-4.モデルの基本操作を覚えよう
5-5.基本の検索を覚えよう
検索を行う
ダイナミックファインダー!
例
@taro = Sample.find_by_name(“太郎”)
これだけで名前が”太郎”のレコードを変数に保存できる!
find_by_○○
↑若干違和感ある書式だけど、簡単!
例2
@hatachi = Sample.find_all_by_age(20)
20歳の人が全部配列で返ってくる
実際に、やってみる
1.ビュー作成
“app/sample/find.html.erb”
<form method=“post” action”/sample/find”>
<input type=“text” name=“fstr”>
<inout type=“submit” value=“送信”>
</form>
<table>
<th>ID</th><th>Name</th><th>Age</th>
<%= render :partial => ”partials/mydata”, :collection => @datas %>
</table>
以前作ったパーシャルを再利用
コントローラーにfindメソッドを追加
app/contorollers/sample_contoroller.rbに追記
def find
@title = “Find Record”
@datas = []
if request.post? then
@datas = Sample.find_all_by_name(params[:fstr])
end
end
routes.rbに追記
get “sample/find”
post “sample/find”
配列を使って検索
例
IDが1,2,3の人を取り出す
@samples = Sample.find( [ 1,2,3 ] )
Sampleモデルの配列が@samplesに入る!
実際に,やってみる
さっき作ったfindメソッドを書き換え
app/contoroller/sample_controller.rb
def find
@title = “Find Record”
@datas = []
if request.post? then
arr = params[:fstr].split(‘,’)
@datas = Sample.find(arr)
end
end
,区切りで送られてきた
値を配列にして、
findに渡している
いまいちだと思ったこと
・さっきの処理方法だと、ユーザーにカンマ区切りで入力させなければならない。
↓
・実際にやるなら、jsでテキストボックス増やさして、カンマでくっつける?
↓
そんなめんどくさい事してられない。
次章では検索について深堀するみたい!次章の方に期待!w
おまけ
1.Railsの特徴の一つ、辞書ファイルを用意できる
config/locale/ja.yml
に単語を登録する
例:
ja:
user: # この単語を使用するコントローラ名
index: # この単語を使用するアクション名
title: ユーザ一覧 # 単語と単語のセット
show: # アクション名
title: ユーザの詳細
↑の例だと、indexアクション内では title = ユーザ一覧,
showアクション内では title = ユーザの詳細
になる。
ロケールごとに表示を変えたりできる。
つまり、英語サイト用の表示も簡単に用意できる!
おまけ2
models
2.Railsでは、pathを予め定義できる
views
config/routes.rb
に記述
app
contorollers
その他
色々…
myapp
migrate
db
その他色々…
その他
色々...
config
routes.rb
例1
シンプルな例
# config/routes.rb
match "/patients/:id" => "patients#show", :as => :patient
/patients/17 に HTTP GET すると、PatientsController の show アクションを
id=17 のパラメータで実行する
# on view.. patient_path(17) # /patients/17 名前付きルートを使うことで、ア
プリケーション側ではURL構造を気にせず設計できるようになります。
また、名前付きルートには path の他に url もあります。
# on view.. patient_url(17) # http://localhost:3000/patients/17
例⒉
Railsでは resources を使って7のアクション(index, new, create, show, edit, update, destroy) を
一度に設定できる。
記述例:
resources :photos
この1行で、
HTTP Verb
--------GET
GET
POST
GET
GET
PUT
DELETE
Path
----/photos
/photos/new
/photos
/photos/:id
/photos/:id/edit
/photos/:id
/photos/:id
action
-----index
new
create
show
edit
update
destroy
named_helper
---------photos_path
new_photo_path
photos_path
photo_path(:id)
edit_photo_path(:id)
photo_path(:id)
photo_path(:id)
これだけの設定ができる!本ではあれだけroutes.rbを忘れずにとか書いてあったのに
おまけ2のおまけ
GETでnewアクション、その後POSTでcreateアクションでに飛ばす流れになっている
新規作成例:
入力 → SampleContoroller → 作成
→ SampleContoroller
/sample/new
def new
/sample
def create
処理
処理
end
end
基本的にresourceを使うことが多い
-only でURLを限定することが多い
例:
resource :profile, :only => [:new, :create , :edit ,update ]
↑プロフィールは作成と更新しかできないよう設定
おまけまとめ
纏めるとこんな使い方ができる
<%= link_to t(‘.create_profile’), new_profile_path %>
解説
<a href=“/profile/new”> プロフィール作成</a>
になる
※ja.yml
create_profile: “プロフィール作成”
を定義しておく
<%= link_to t(‘.create_profile’), new_profile_path %>
ソースコードがすっきり!国際化対応!意図しないページに飛ばない!
思ったこと
・URLの制約を理解していれば、コードの可読率大幅アップ
・アジャイル開発に向いている
・最初の制約を覚える時期は大変だが、その後は超スピードで開発できる
・rspecっていうテスト用プラグインが便利。