2011-10-14 35 views
13

Tôi muốn phục vụ các mẫu phía máy khách đã được xử lý trước thông qua HAML. Tôi đã thử bằng cách sử dụng haml_assets gem và thêm đoạn mã sau vào một initializer:Thêm HAML vào đường ống nội dung Rails

Rails.application.assets.register_engine ".haml", Tilt::HamlTemplate 

Cả hai phương pháp phục vụ HAML liệu và không được biên dịch HAML khi tôi truy cập vào tài sản. Làm thế nào tôi có thể thêm HAML vào đường ống?

Trả lời

0

Sử dụng phương pháp tương tự tôi đã có:

%tr 
    %th 
    %a.action.link.show 
    %td 
    %td 

trở Haml như tinh khiết. Nhưng

%tr 
    %th 
    %a.action.link.show 
    %td cell 2 
    %td cell 3 

được phân phát dưới dạng đoạn html. Vì vậy, tôi nghĩ rằng đây là một cái gì đó với đá quý haml. Bạn có thể buộc chuyển đổi Haml với một cái gì đó như thế này:

%tr 
    %th 
    %a.action.link.show 
    %td &nbsp 
    %td &nbsp 

Hy vọng nó sẽ giúp ...

5

này làm việc cho tôi:

# app/assets/javascripts/test.html.haml 

%p hello 

# config/initializers/haml_template.rb 

Rails.application.assets.register_mime_type 'text/html', '.html' 
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate 

này làm việc cho http://127.0.0.1:3000/assets/test.html.haml

Rails.application.assets là một Sprockets::Environment.

Xem ở đây để tham khảo API:

+0

này hoạt động dandy cho tôi trong môi trường dev của tôi, nhưng khi tôi đẩy nó vào sản xuất tôi m vẫn nhận được HAML thô. Đào ngay bây giờ nhưng nếu có ai có manh mối, tôi sẽ có nhiều nghĩa vụ. –

+0

Nó không hoạt động trong môi trường dev của tôi, bạn có thể giúp tôi không? Nếu tôi truy cập tệp .html.haml hoặc tệp .html trực tiếp, nó sẽ hoạt động dưới dạng chuỗi, chứ không phải dưới dạng html, bất kỳ tệp nào trong số đó. – felipeclopes

12

Chỉ cần để xóa mọi thứ lên, kể từ khi tôi tìm ra câu trả lời hiện tại một chút khó chịu (dẫn tôi đến đúng hướng dù)

Nó hoạt động, nếu tôi có dòng này trong tệp khởi tạo:

# config/initializers/haml_assets.rb 
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate 

Ném file Haml của bạn vào thư mục tài sản, ví dụ:

# app/assets/templates 

Do không sử dụng đá quý haml_asset mặc dù!

+0

Điều này không hiệu quả đối với tôi trên Rails 3.2.13. Chỉnh sửa: Có lẽ nó không hoạt động và tôi chỉ cần thay đổi mẫu để buộc biên dịch lại? Điều tương tự cũng được yêu cầu cho câu trả lời của người dùng2470396. – Ibrahim

+0

Vâng, sau khi tôi sửa đổi các tập tin nó làm việc, mặc dù tôi đã cố gắng sửa đổi application.rb sau khi điều này đã không làm việc, nhưng tôi sau đó trở lại tất cả mọi thứ từ câu trả lời khác và nó vẫn làm việc. – Ibrahim

10

Các mã sau vào application.rb làm việc cho tôi trong Rails 3.2 (cả trong việc phát triển và sản xuất sau khi tiền biên dịch):

require 'haml' 

config.assets.paths << Rails.root.join("app", "assets", "templates") 

class HamlTemplate < Tilt::HamlTemplate 
    def prepare 
    @options = @options.merge :format => :html5 
    super 
    end 
end 

config.before_initialize do |app| 
    require 'sprockets' 
    Sprockets::Engines #force autoloading 
    Sprockets.register_engine '.haml', HamlTemplate 
end 

này cho phép bạn đưa bạn mẫu trong ứng dụng/tài sản/templates được đặt tên với hậu tố .html.haml (bạn cần tệp .html trong đó hoặc các tệp .htm khác được tạo thay vì .html trong quá trình biên dịch trước).

+0

đây là người duy nhất làm việc cho tôi. –

+1

Làm việc cho tôi quá (trong dev cho đến nay, ít nhất). Một lưu ý: Nếu mẫu HAML của bạn vẫn hiển thị dưới dạng HAML thô, hãy thực hiện một thay đổi nhỏ và tải lại. Rails có vẻ khá tích cực về việc lưu trữ các tài sản, ngay cả trong dev. – Micah

0

Hai trong số các câu trả lời trước đây ở đây phải được kết hợp trước khi chúng tôi có giải pháp đầy đủ.

Các dòng sau làm việc trong phát triển:

# config/initializers/haml_assets.rb 
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate 

Nhưng sau đó không thành công trên bất kỳ tiền biên dịch.

Đối với tài sản phục vụ Haml làm việc sau một tiền biên dịch, chúng tôi cũng cần những dòng này trong application.rb:

require 'haml' 

config.assets.paths << Rails.root.join("app", "assets", "templates") 

class HamlTemplate < Tilt::HamlTemplate 
    def prepare 
    @options = @options.merge :format => :html5 
    super 
    end 
end 

config.before_initialize do |app| 
    require 'sprockets' 
    Sprockets::Engines #force autoloading 
    Sprockets.register_engine '.haml', HamlTemplate 
end 
Các vấn đề liên quan