RubyでオレオレWebフレームワークを作っているのですが、だいぶ形になってきたので知識の整理がてら色々まとめてみる✍ 今回は第4回目です💪
👇第3回 クエリ文字列を含んだGETに対応したRouting機能作る🛣はこちら
今回のゴール
前回は、クエリ文字列を受け取れるようRouting機能を作成しました。今回は渡されたクエリ文字列をViewファイルに埋め込んで表示するようなViewのレンダリング機能を作っていこうと思います👍
実際の実装イメージはこちら、インスタンス変数を定義してrender
メソッドで指定のViewを呼び出すような形です。動きはちょっとRailsっぽいですね🚃
require_relative './lib/main.rb' router.get '/hello' do |params| @body = params['word'] render :index end
ちなみにViewに使うファイルは./views
配下にindex.erb
という形で下記のように配置されるものとします。
<!-- ./vires/index.erb --> <html> <head> <meta charset="UTF-8"> <title>sample</title> </head> <body> <%= @body %> </body> </html>
処理の流れ
実際にViewをレンダリングする処理の流れを記載しておきます。
app.rb
にroutingが定義される。- routingの中でインスタンス変数を定義する。
- DSLとして定義した
render
メソッドにViewのファイルパスを引数として渡す render
メソッド中でViewファイルの内容をもとにERB
のレンダリング結果を返却- 結果をレスポンスのボディに入れて返す。
というわけで今回作るのは、下記のような機能です👩💻
DSLとしてrender
を提供する
まずDSL
としてメソッドをapp.rb
を呼び出せるようにするにはrender
メソッドをmain.rb
に追加します。
# lib/main.rb def render(path) file_path = "./views/#{path}.erb" # Viewファイルの内容をもとに`ERB`のレンダリング結果を返却 end
とりあえず、これでapp.rb
でrender :index
を呼び出したときに./views/index.erb
というレンダリングするファイルパスを取得することが出来るようになりました🙌
Viewファイルのパスを受け取ってERB
のレンダリング結果を返却する
それでは、実際にERB
のレンダリング処理を実装していきます。しかし、これはrubyのERB
ライブラリがよくできているのでシンプルです✨
下記のようにFile.read
でファイルパスから実際のファイルの内容を取得して、ERB
オブジェクトを生成して結果を返却するだけです。
# lib/main.rb def render(path) file_path = "./views/#{path}.erb" template_file = File.read(file_path) ERB.new(template_file).result end
これで、下記のようなrouting
と定義したときにrender :index
の結果がインスタンス変数を含めて解決された状態で返却されます🎉
require_relative './lib/main.rb' router.get '/hello' do |params| @body = params['query'] render :index end
こんな感じ🙋
<html> <head> <meta charset="UTF-8"> <title>sample</title> </head> <body> hoge </body> </html>
おわりに
今回は、ERB
を使ったViewのレンダリング機能を作成しました。ここまで来る特定のURLに遷移したさいに特定のViewをレンダリングするようなところまで出来るようになったので、だんだんフレームワークとしての形をなしてきましたね✨
次回は、routing機能をPOST
に対応させるようなところを書いていければと思います👩💻