當我們在寫 View 時,大家對於 erb 這個名詞應該不陌生, html.erb 讓我們可以在寫 html 的同時,插入 ruby 的語法,我們會使用 <%= %> 這樣的標籤
Erubis 是 Rails 用來執行 Erb 的套件
接下來我們就用它來 render view
在 gemfile 加入 erubis 套件,並且 bundle install
gem.add_runtime_dependency "rack"
gem.add_runtime_dependency "erubis"
gem.add_development_dependency "rack-test"
之後建立一個 test file,並加入下列程式碼
# some_directory/erb_test.rb
require "erubis"
template = << TEMPLATE
Hello! This is a template.
It has <%= whatever %>.
TEMPLATE
eruby = Erubis::Eruby.new(template)
puts eruby.src
puts "=========="
puts eruby.result(:whatever => "ponies!")
設定完成,我們就可以像 erb 一樣讀取 template 囉
接下來,我們將 controller 引入檔案中,並把之前做的 controller class 刪除
require "rainbow/controller"
在 rainbow/lib/rainbow 建立一個 controller.rb
設定 controller class
module Rainbow
class Controller
def initialize(env)
@env = env
end
def env
@env
end
end
end
載入 erubis
並定義 render 方法
讓 controller 去找 view
require "erubis"
def render(view_name, locals = {})
filename = File.join "app", "views", "#{view_name}.html.erb"
template = File.read filename
eruby = Erubis::Eruby.new(template)
eruby.result locals.merge(:env => env)
end
回到 best_quotes
我們把當初設定的 quote 改以 render 的方式渲染
class QuotesController < Rulers::Controller
def a_quote
render :a_quote, :noun => :winking
end
end
另外在 best_quotes/app 建立 view 資料夾
增加 a_quote.html.erb 檔案,然後填入 html
<p>
There is nothing either good or bad but
<%= noun %> makes it so.
</p>
<p>
Ruby version <%= RUBY_VERSION %>
</p>
在 Rails , view 檔名會對應到 controller action
所以我們要將 controller 轉換成 snake_case,好讓他可以找到相對應的 view
# rainbow/lib/rainbow/controller.rb:
def controller_name
klass = self.class
klass = klass.to_s.gsub /Controller$/, ""
Rainbow.to_underscore klass