資料ダウンロード • 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っていうテスト用プラグインが便利。
© Copyright 2024 ExpyDoc