2021年1月5日火曜日

(Ruby) tilt 超入門

概要

tilt は複数のテンプレートファイルを同じインタフェースで扱うことができる便利ライブラリです
今回は erb を使って簡単な操作方法を紹介します

環境

  • macOS 11.1
  • Ruby 2.7.2p137
    • tilt 2.0.10

インストール

  • bundle init
  • vim Gemfile
gem "tile"
  • bundle install

Getting Started

とりあえず動かしてみます

  • vim sample.erb
<%= @message %>


  • vim test.rb
require 'erb'
require 'tilt'

@message = "hello"
sample = Tilt.new('sample.erb')
output = sample.render(self)
puts output


  • bundle exec ruby test.rb

    => hello


テンプレート側でインスタンス変数を参照する場合は上記のようになります
Ruby スクリプト側でもインスタンス変数を宣言して render する際にインスタンス変数が存在しているクラスのオブジェクトを渡す必要があります

クラス内で使用する

render する際に self や Object.new を渡すケースは少ないのでクラス内で使用する場合は以下のようにします

  • vim test.rb
require 'erb'
require 'tilt'

@message = "hello"

class MyClass
  def initialize
    @sample = Tilt.new('sample.erb')
    @message = "hello in MyClass"
  end

  def render
    output = @sample.render(self)
    puts output
  end
end

cls = MyClass.new
cls.render


  • bundle exec ruby test.rb

    => hello in MyClass

ハッシュを渡す

テンプレートにハッシュを渡すこともできます
参照する場合はハッシュのキーを使って参照します

  • vim sample.erb
<%= message %>


  • vim test.rb
require 'erb'
require 'tilt'

h = {'message': 'hello'}
sample = Tilt.new('sample.erb')
output = sample.render(self, h)
puts output


  • bundle exec ruby test.rb

    => hello

オブジェクトを渡す

テンプレート側で渡されたオブジェクトのメンバを参照してみます

  • vim sample.erb
<%= hello %>


  • vim test.rb
require 'erb'
require 'tilt'

class Message
  def initialize
    @hello = 'hello'
  end

  attr_accessor :hello
end

msg = Message.new
sample = Tilt.new('sample.erb')
output = sample.render(msg)
puts output


  • bundle exec ruby test.rb

    => hello

オブジェクトを渡しているので参照する側はメンバやメソッドを直接参照する感じになります

ブロックを渡す

ブロックを渡してテンプレート側でコールすることもできます
テンプレート側は yield でブロックを受け取りましょう

  • vim sample.erb
<%= yield %>


  • vim test.rb
require 'erb'
require 'tilt'

class Message
  def initialize
    @msg = 'hello'
  end

  def hello
    Proc.new {
      @msg + "!!"
    }
  end
end

msg = Message.new
sample = Tilt.new('sample.erb')
output = sample.render(&msg.hello)
puts output


  • bundle exec ruby test.rb

    => hello!!

参考サイト

0 件のコメント:

コメントを投稿