640 likes | 688 Views
資料ダウンロード. 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 設定.
E N D
資料ダウンロード • http://sasoonware.com/file/
目次 5-1.モデル利用のプロジェクトを作ろう 5-2.マイレグレーションとシード 5-3.アプリケーションの実行からデプロイまで 5-4.モデルの基本操作を覚えよう 5-5.基本の検索を覚えよう
5-1.モデル利用のプロジェクトを作ろう 5-2.マイレグレーションとシード 5-3.アプリケーションの実行からデプロイまで 5-4.モデルの基本操作を覚えよう 5-5.基本の検索を覚えよう
DB設定 database.ymlにDB設定を記述 このファイル! 因みに、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:stringage:integermails:stringtel: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.rbが作成される sampleモデルを作ったら ○○_create_samples.rbが作成される(○○は作成年月日時分秒)
migrate ファイルの中身 デフォルト状態 class CreateSamples < ActiveRecord::Migration defchange end end 記述後 ※コマンドプロンプトで作成した場合はデフォルトで記述済み class CreateSamples < ActiveRecord::Migration defchange create_table :sample do |t| t.string :name t.integer:age t.string :mail t.string :tel t.timestanmp end end ※ExoIDeの場合 書き方が少し違う
疑問点 tって何? 余り深く考えずにマイグレーションの文法みたいなものr(らしい) timestampsは? 恐らくcreated_atカラム、updated_atカラムの生成を行っている
マイグレーションの実行 ここに移動 rake db:migrate を実行
データベースを確認 データベースmyapp内 samplesテーブル
シードファイル作成 シードとは? 予めテーブル内に入れておく値 このファイルに記述
記述例 sample.rb内 Sample.create( name: ”yoshimura”, age: 23, mail: “satoshi.yoshimura.so@gmail.com”, tel: “090-9999-9999”) モデルクラスの持つ、createメソッドを利用する為の記述
シード作成 ここに移動 rake db:seed を実行
実行結果 sampleテーブル内 データが挿入されている
どんな使い方をするのか? 都道府県や銀行コードのような予め値が決まっているカラムに便利! カテゴリなどをデータベース内に定義する場合や、 初期ユーザーは管理者として扱うことが決まっている場合などにも使える
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
表示:全体のレイアウトの修正 このファイル!
コントローラーからの値を用いた表示 body部分を修正 <body> <%= render “partial/myheader” %> <%= yield %> <%= render “partials/myfooter” %> </body> <%= yield %>内に、 アクションから呼び出されたテンプレートが作成するHTMLコンテンツが埋め込まれる。
indexページに値を表示する このファイル!
データベースからとってきた値表示 • <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.eachdo |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部だけ表示して、データ部分はパーシャルで受け取る
どのファイル? このファイル!
パーシャルに記述 <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
フォームでレコードを作成する このファイル!
入力フォームは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を用意 作成!
受取の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> 入力画面へのリンク
入力画面 作成!
入力用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で送る?)
更新アクションを追加 defupdate @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”