64
資資資資資資資資 http://sasoonware.com/file/

資料ダウンロード

Embed Size (px)

DESCRIPTION

資料ダウンロード. 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 設定. - PowerPoint PPT Presentation

Citation preview

資料ダウンロード• 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設定

myapp

app

models

views

contorollers

その他色々…

db

migrate

その他色々…その他

色々...

config daatabase.yml このファイル!

因みに、 database.yml.sample というファイルが生成されているので、それをコピって作る

database.yml に DB 設定を記述

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 モデルを作ったら

myapp

app

models

views

contorollers

その他色々…

db

migrate

その他色々…その他

色々...

sample.rb が作成される

○○_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 :namet.integer :aget.string :mailt.string :tel

t.timestanmpend

end

記述後 ※ コマンドプロンプトで作成した場合はデフォルトで記述済み

※Exo IDe の場合 書き方が少し違う

疑問点t って何?

余り深く考えずにマイグレーションの文法みたいなもの r (らしい)

timestamps は?恐らく created_at カラム、 updated_at カラムの生成

を行っている

マイグレーションの実行

myapp

app

models

views

contorollers

その他色々…

db

migrate

その他色々…その他

色々...

ここに移動

rake db:migrate

を実行

データベースを確認データベース myapp 内

samples テーブル

id integer autoincrement primary

name string

age integer

mail string

tel string

created_at timestamp ( 作成日 )updated_at timestamp ( 更新日 )

シードファイル作成シードとは?

予めテーブル内に入れておく値

myapp

app

models

views

contorollers

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

このファイルに記述

記述例

sample.rb 内

Sample.create(name: ”yoshimura”,age: 23,mail: “[email protected]”,tel: “090-9999-9999”)

モデルクラスの持つ、 create メソッドを利用する為の記述

シード作成

myapp

app

models

views

contorollers

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

ここに移動

rake db:seedを実行

実行結果

id name age mail tel created_at updated_at

1 “yoshimura” 23 “[email protected]

“090-9999-9999” 2013-08-24 10:30:30

2013-08-24 10:30:30

sample テーブル内

データが挿入されている

どんな使い方をするのか?

都道府県や銀行コードのような予め値が決まっているカラムに便利!

カテゴリなどをデータベース内に定義する場合や、

初期ユーザーは管理者として扱うことが決まっている場合などにも使える

5-1. モデル利用のプロジェクトを作ろう

5-2. マイレグレーションとシード

5-3. アプリケーションの実行からデプロイまで

5-4. モデルの基本操作を覚えよう

5-5. 基本の検索を覚えよう

コントローラーで全レコードを取り出す

app/contorollers/sample_contoroller.rb 内

※styleseet の問題なので <table> 用のスタイルを追加しようは割愛

#config: utf-8

class SampleContoroller < ApplicationContorollerlayout “mylayout”

def index@title = “this is Index Page.”@datas = Sample.all

endend

表示:全体のレイアウトの修正

このファイル !

myapp

app

models

views

sample

_mydata.html.erb

index.html.erb

layouts mylayout.html.erbcontorollers

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

コントローラーからの値を用いた表示

<body><%= render “partial/myheader” %><%= yield %><%= render “partials/myfooter” %>

</body>

<%= yield %> 内に、アクションから呼び出されたテンプレートが作成する HTML コンテンツが埋め込まれる。

body 部分を修正

indexページに値を表示する

このファイル!

myapp

app

models

views

sample

_mydata.html.erb

index.html.erb

layouts mylayout.html.erbcontorollers

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

データベースからとってきた値表示

<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>

<% @datas.each do |data| %>

<% 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 部だけ表示して、データ部分はパーシャルで受け取る

どのファイル?

myapp

app

models

views

sample

index.html.erb

layouts mylayout.html.erb

partials

_mydata.html.erb

contorollers

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

このファイル!

パーシャルに記述

<tr><td><%= mydata.id %></td><td><%= mydata.name %></td><td><%= mydata.age %></td><td><%= mydata.mail %></td><td><%= mydata.tel %></td>

</tr>

中身を記述

イメージ

コントローラー

@datas = Sample.all データを取り出す

モデルSample

ビュー

データを渡す レイアウ

トレイアウト

(大きな見た目)

パーシャル パーシャル パーシャル

パーシャル

(見た目の部品)DB

データを取り出す

5-1. モデル利用のプロジェクトを作ろう

5-2. マイレグレーションとシード

5-3. アプリケーションの実行からデプロイまで

5-4. モデルの基本操作を覚えよう

5-5. 基本の検索を覚えよう

モデルの基本操作

1.all メソッド

smp = sample.allサンプルテーブルの中身全部が変数 smp の中に入る

smp.name orsmp[“name”]

で name カラムの値をとり出せる

レコードの新規作成

1. クラスを作成Yoshi = sample.new ( :name => “吉村智志” , :age 23 , :mail => “taro@yamada” ,

:tel => “090-6811-1291” )

さっき作ったモデルクラス これで値を持つクラスが作成され

る2. データベースに保存

Yoshi.save

Rails上で吉村智志という人物を作成するには?

フォームでレコードを作成する

myapp

app

models

views

layouts mylayout.html.erb

sample index.html.erb

contorollers

その他色々…

db

migrate

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 を用意

myapp

app

models

views

sample

index.html.erb

show.html.erb

layouts mylayout.html.erb

contorollers

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

作成!

受取の 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')

で今日以後に作ったレコードすべて消去

ここから先はさっきとほとんど一緒

デリートアクション用のページへ。クエリーで 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 %>”><a href=“/sample/delete?id=<%=mydata.id %>”>

</tr>

一覧から消去へ

js 部分は省略

デリート用のアクションを用意

コントローラー

def delete obj = Sample.find(params[:id])obj .destroyredirect_to :action => “index”

end

※削除はコントローラでやってしまう。 本では index に戻していたが、「削除されました」を表示するビューを作っても良い

※routes.rbget “sample/delete”も忘れずに

次は更新実は Save メソッドは更新も兼ねている!

例:一覧→入力→更新を行うh

<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>

一覧画面 index.html.erb

入力画面へのリンク

入力画面

myapp

app

models

views

sample

index.html.erb

update.html.erb

その他

layouts

mylayout.html.erb

contorollers

その他色々…

db

migrate

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 で送る ? )

コントローラーで値受け取って更新

myapp

app

models

views

contorollers sample_controller.rb

その他色々…

db

migrate

seeds.rb

その他色々…その他色々...

更新アクションを追加def update

@result = Sample.find(params[:id])if request.post? then

@result.name = params[‘name’]@result.age = params[‘age’][email protected] = params[‘mail’]@result.tel = params[‘tel’]@result.saveredirect_to :action => “index”

else@title = “Update ID” + params[:id]

endend

※同じように 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)

endend

,区切りで送られてきた値を配列にして、find に渡している

いまいちだと思ったこと

・さっきの処理方法だと、ユーザーにカンマ区切りで入力させなければならない。↓・実際にやるなら、 js でテキストボックス増やさして、カンマでくっつける?↓そんなめんどくさい事してられない。

次章では検索について深堀するみたい!次章の方に期待! w

おまけ

1. Rails の特徴の一つ、辞書ファイルを用意できる

config/locale/ja.ymlに単語を登録する

例 :ja: user: #  この単語を使用するコントローラ名 index: # この単語を使用するアクション名 title: ユーザ一覧 # 単語と単語のセット show: # アクション名 title: ユーザの詳細

↑の例だと、 index アクション内では  title = ユーザ一覧 ,show アクション内では title = ユーザの詳細になる。ロケールごとに表示を変えたりできる。つまり、英語サイト用の表示も簡単に用意できる!

おまけ2

2.Rails では、 path を予め定義できる

config/routes.rbに記述

myapp

app

models

views

contorollers

その他色々…

db

migrate

その他色々…その他

色々...

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 Path action named_helper --------- ----- ------ ---------- GET /photos index photos_path GET /photos/new new new_photo_path POST /photos create photos_path GET /photos/:id show photo_path(:id) GET /photos/:id/edit edit edit_photo_path(:id) PUT /photos/:id update photo_path(:id) DELETE /photos/:id destroy 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>

になる

を定義しておく

<%= link_to t(‘.create_profile’), new_profile_path %>ソースコードがすっきり!国際化対応 !意図しないページに飛ばない!

※ja.ymlcreate_profile: “ プロフィール作成”

思ったこと

・ URL の制約を理解していれば、コードの可読率大幅アップ

・アジャイル開発に向いている

・最初の制約を覚える時期は大変だが、その後は超スピードで開発できる

・ rspec っていうテスト用プラグインが便利。