12/08/2018, 13:56

Giới thiệu gem Mustache Ruby on Rails

Tổng quan Mustache như một sự thay thế cho view. Thay vì view bao gồm file ERB hay HAML với helper và logic, view của bạn chia làm hai phần, Ruby class và HTML template. Chúng tôi gọi phần Ruby class là view, còn phần HTML là template. Phần template không thực thi gì nhưng tham chiếu với các ...

Tổng quan

Mustache như một sự thay thế cho view. Thay vì view bao gồm file ERB hay HAML với helper và logic, view của bạn chia làm hai phần, Ruby class và HTML template. Chúng tôi gọi phần Ruby class là view, còn phần HTML là template. Phần template không thực thi gì nhưng tham chiếu với các methods trong view của bạn. Mustache giúp viết template gọn gàng hơn, dễ dàng test hơn và giúp làm việc với front end thêm thú vị hơn.

Cài đặt

Cài đặt gem ở local:

gem install mustache

Hoặc thêm vào gemspec

s.add_dependency "mustache", "~> 1.0"

Sử dụng gem Mustache

Ví dụ:

>> require 'mustache'
=> true
>> Mustache.render("Hello {{planet}}", :planet => "World!")
=> "Hello World!"
class Simple < Mustache
  def name
    "Chris"
  end

  def value
    10_000
  end

  def taxed_value
    value * 0.6
  end

  def in_ca
    true
  end
end

Chúng ta tạo một Ruby class đơn giản và định nghĩa các methods. Một số methods tham chiếu đến những methods khác, một số trả về values, một số trả về booleans. Bây giờ chúng ta viết template:

Hello {{name}}
You have just won {{value}} dollars!
{{#in_ca}}
Well, {{taxed_value}} dollars, after taxes.
{{/in_ca}}

Template này tham chiếu tới các methods ở view. Đây là cách để lấy chúng:

Simple.render

Kết quả trả về:

Hello Chris
You have just won 10000 dollars!
Well, 6000.0 dollars, after taxes.

Thật đơn giản.

Các dạng Tag

Tham khảo tại: Tag Types

Escaping

Ví dụ: Sử dụng {{variable}} trong template với 5 > 2 sẽ cho kết quả là 5 > 2. {{{variable}}} sẽ cho kết quả 5 > 2.

Dict-Style Views

Template (Winner.mustache):

Hello {{name}}
You have just won {{value}} bucks!

Chúng ta có thể fill các giá trị:

view = Winner.new
view[:name] = 'George'
view[:value] = 100
view.render

Kết quả trả về:

Hello George
You have just won 100 bucks!

Chúng ta có thể sử dụng lại cùng object:

view[:name] = 'Tony'
view.render
Hello Tony
You have just won 100 bucks!

Templates

Mặc định, một view sẽ cố thử tìm template trên ỏ đĩa bằng cách tìm file HTML ở thư mục hiện tại:

TemplatePartial => ./template_partial.mustache

Bạn có thể thiết lập search path bằng Mustache.template_path:

class Simple < Mustache
  self.template_path = File.dirname(__FILE__)
  ... etc ...
end

Nếu bạn chỉ muốn thay đổi template đã dùng, bạn có thể thay đổi trực tiếp Mustache.template_file:

Simple.template_file = './blah.mustache'

Mustache cũng cho phép bạn định nghĩa phần mở rộng sẽ dùng:

Simple.template_extension = 'xml'

Helpers

module ViewHelpers
  def gravatar
    gravatar_id = Digest::MD5.hexdigest(self[:email].to_s.strip.downcase)
    gravatar_for_id(gravatar_id)
  end

  def gravatar_for_id(gid, size = 30)
    "#{gravatar_host}/avatar/#{gid}?s=#{size}"
  end

  def gravatar_host
    @ssl ? 'https://secure.gravatar.com' : 'http://www.gravatar.com'
  end
end

Include:

class Simple < Mustache
  include ViewHelpers

  def name
    "Chris"
  end

  def value
    10_000
  end

  def taxed_value
    value * 0.6
  end

  def in_ca
    true
  end

  def users
    User.all
  end
end

Về @ssl trong gravatar_host, có rất nhiều cách để thiết lập nó. Sau đây là ví dụ:

class Simple < Mustache
  include ViewHelpers

  def initialize(ssl = false)
    @ssl = ssl
  end

  ... etc ...
end
Simple.new(request.ssl?).render

Cuối cùng, template có hình dạng như sau:

<ul>
  {{# users}}
    <li><img src="{{ gravatar }}"> {{ login }}</li>
  {{/ users}}
</ul>

Tổng kết

Hy vọng qua bài viết này, mọi người có thể phần nào nắm được về gem Mustache của Rails. Bài viết được dịch từ Mustache

0