MVCの関係
ビューにデータを受け渡す
Railsでの処理がルーティング→コントローラ→ビューの順番で進む際にコントローラの役割を、リクエストに応じたビューをレスポンスとして返すことだが、実はそれだけでなく、コントローラのアクションの中で何らかの処理を行うことも可能である。
コントローラで受け取ったデータをビューで表示
コントローラに、ビューに表示したい情報を定義
コントローラのアクション内に定義したインスタンス変数(@つきの名前の変数)は、そのアクションが表示するビュー内で利用することができる。
tweets_controller
のindexアクション
とindex.html.erb
を利用して確認する
app/controllers/tweets_controller.rb
1 2 3 4 5 6 7 |
class TweetsController < ApplicationController
def index
@tweet = "プログラミングなう"
end
end
|
受け取ったデータをビューで表示
編集によってビューに@tweet = "プログラミングなう"
という情報が渡されたはず。
インスタンス変数の呼び出し範囲
インスタンス変数をtweets_controller
のindex
アクションの中で定義した場合、このインスタンス変数は、index
アクションに対応したビューであるapp/views/tweets/index.html.erb
の中で利用できる。
Railsの見た目用のファイルであるerb
ファイルの中でRubyのコードを利用する場合、<%= %>
という記述で囲う。
app/views/tweets/index.html.erb
1 |
<%= @tweet %>
|
ビューで、定義した変数を使用するためには<%= %>
で変数名を囲んであげる必要がある。<%= %>
の中のrubyコードは、ビューをレスポンスとして返すまでに実行されて、最終的にはHTMLになる。
1 |
<%= 変数名 %> #変数をビュー内で使用
|
これでビューにデータを受け渡し、表示させるということができているはず。実際にサーバーを立ち上げて確認。
ブラウザに下記のURLにアクセスすると、下の画像のような状態になるはず。
http://localhost:3000/tweets
モデルを利用してデータを表示
データベースの値をビューに表示
tweetsテーブルのレコードの情報をビューに表示
1つのtweetの情報をデータベースから取ってきて、ビューに表示。
コントローラにて、データベースからひとつのtweetの情報。
1 2 3 4 5 6 7 |
index.html.erb上で@tweetという変数を利用できるようになった。findメソッドは引数に指定したidにあたるレコードを1件だけ取得するメソッド。
@tweetには、tweetsテーブルのレコード1行が、Tweetクラスのインスタンスとして代入されている。以下で、ビューにて@tweetの値を表示させる。
1 2 3 |
<div class="contents row" >
<p><%= @tweet.text %></p>
</div>
|
こうすることで、localhost:3000/tweetsにアクセスした際、@tweetに代入されているtweetsテーブルのレコードの、textカラムの値が表示されるようになる。
プロパティ値
プロパティ値とは各カラムに保存されている値のことを指す。
編集したindex.html.erbの@tweet.textという記述の@tweetという変数はtweetsテーブルの1つのインスタンスを示す。その場合、「変数.カラム名」と記述することによって、変数で指定したインスタンスの当該カラムのプロパティ値を取り出すことができる。
tweetという変数にtweetモデルのインスタンスを定義。そして、そのインスタンスに対して「.カラム名」と記述することによって、そのプロパティ値を取り出すことができる。
http://localhost:3000/tweets
表示が確認できましたら、次に複数のtweetの情報を1つのtweetごとに繰り返し順番に表示。
参考書参照
「プロになるためのWeb技術入門」p29 ~, 項2.3, 項2.4, 項2.5
複数のデータをビューに表示
1 2 3 4 5 6 7 |
class TweetsController < ApplicationController
def index
@tweets = Tweet.all
end
end
|
上記の編集によってビューにツイートテーブルの全てのレコードがインスタンスの配列として受け渡された。これからそれらの情報をビューに表示させていく。
その際、Rubyのカリキュラム内で学習したeachメソッドを利用する方法で複数のtweetを表示していく。
1 2 3 4 5 |
このようにすると、eachメソッドのdo
とend
で囲まれた<%= tweet.text %>
の部分を、@tweetsのレコードの数だけ繰り返し表示するようになる。
http://localhost:3000/tweets
※テストサーバーを立ち上げていない場合にはもう一度「rails s」コマンドでサーバーを起動する必要がある。
レイアウト変更
ビューにHTML、CSSファイルを適用して装飾を加えて見本のPictweetのような見た目にしていく。
ヘッダー部分を完成させる
ヘッダー部分は全ページ共通なので、見た目の雛形であるapplication.html.erb
に書く。
改行を適応させる
デフォルトの状態ではrailsは文字列の改行を読み込まず、改行した状態で文章を表示させることはできる。改行がしっかりと適応されるようにするためにはsimple_formatというメソッドを使う必要がある。
simple_format
simple_formatメソッドは下記の条件で文字列を加工してくれるメソッド。このメソッドを使って改行を反映したツイートをビューに表示にさせる。
①改行は<br/>
を付与
②文字列を<p>
で括る
1 |
<%= simple_format(引数) %>
|
1 2 3 4 5 6 7 8 |
tweet.textで取得したツイートの本文をsimple_formatによって加工している。この処理によってツイートの改行が反映されるようになる。
ヘルパーメソッド
simple_format
のように、Railsでは主にviewでHTMLタグを出現させたりテキストを加工するために予めメソッドが用意されている。これらをまとめて、ヘルパーメソッドという。他には、form_tag
(フォームを出現させるメソッド)やlink_to
(aタグを出現させるメソッド)などがある。
CSSファイルを適用する
HTMLファイルの適用が終わったので、続いてCSSファイルの適用を行なっていく。
stylesheet_link_tag
CSSファイルの読込みはHTMLのheadタグ内のstylesheet_link_tag
から読み込まれる。Railsの場合レイアウトファイルがあるので、application.html.erb
にheadタグの記述がある。application.html.erb
の3行目に注目。
1 2 3 4 5 6 |
<head>
<title>Pictweet</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
|
cssファイルはapp/assets/stylesheets/
というディレクトリに配置する。application.html.erbのstylesheet_link_tag
の部分にapplication
と書いてあるので、このHTMLからはapp/assets/stylesheets/application.cssというCSSファイルを読み込むことを示している。
require_tree
application.css
の13行目に注目。
app/assets/stylesheets/application.css
1 2 3 4 5 6 |
/*
## 中略 ##
*
*= require_tree .
*= require_self
*/
|
application.cssには、どのcssを読み込むかという設定が書いてある。require_tree
には引数として与えられたディレクトリ以下のcssファイルをアルファベット順に全て読み込むという意味がある。現在require_treeの引数には.(ドット)が渡されている。引数.(ドット)はカレントディレクトリを表す。
つまり、この記述によってapp/assets/stylesheets
というディレクトリにあるcssファイルは全て読み込まれることになる。
「style.scss」と「setting.css」を下記のディレクトリに配置しましょう
style.scss
setting.css
上記の見本とstylesheetフォルダ内のファイル数が異なっても問題はない。
- app
- assets
- stylesheets
- style.scss
- setting.css
- stylesheets
- assets
scss
という拡張子はcssファイルの一種。今は気にせずに追加する。
フォントファイルを適用する
レイアウトを編集する際に、CSSやHTMLの編集に加えて文字のフォントの編集も可能。Railsでフォントを変更する際にはフォントファイルというものを追加する。
フォントファイル
フォントファイルとは、文字のフォントを変更するためのファイル。このファイルには、フォントの情報が記載してある。Railsでフォントを読み込むためにはapp/assets/fonts
というディレクトリにフォントファイルを配置し、CSSファイルにフォントファイルの読み込みを記述する必要がある。
- app
- assets
- fonts
- フォントファイル
- fonts
- assets
追加したフォントを使用する際には、CSSファイルにフォントファイルの指定を行う。app/assets/stylesheets/style.scss
の11行目にfont_1_honokamin.ttf
という記述があり、これがフォントファイルの指定を行なっている。
1 2 3 4 5 6 |
@font-face {
font-family: 'ほのか明朝';
src: url('font_1_honokamin.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
|
「fonts」というディレクトリを以下のディレクトリに作成する
- app
- assets
- fonts
- assets
「font_1_honokamin.ttf」を下記のディレクトリに配置する
- app
- assets
- fonts
- font_1_honokamin.ttf
- fonts
- assets
レイアウトの変更を確認する
以上の作業で、HTMLの編集、CSSの編集、フォントファイルの適用が終了。実際に編集が適用されているかを確認する。
imageカラムに画像のURLを保存する
imageカラムに画像のURLをペースト
sequel Proのtweetsテーブルを開き、一番上のレコード(idが1のレコード)のimageカラムをダブルクリックすると以下の画像のように表示されるので、今コピーした画像のURLをペーストする。
http://localhost:3000/tweets
以下の画面のようになっていることを確認する。
Ruby on Railsの全体フロー図を確認
MVC(エム・ブイ・シー)
Railsではルーティング→コントローラー→モデル→ビューの順番に処理が行われる。このようにモデル(model)とビュー(view)とコントローラー(controller)を使用して処理を行なうシステムをそれぞれの頭文字を取ってMVCと呼ばれている。以下の図に処理の流れをまとめた。