常見問題集

Haml

如何於元素後加上標點符號,例如「I like <strong>cake</strong>!」?

表達文件結構與表達內嵌格式化是兩個截然不同的問題。Haml 主要用於結構,因此處理格式化的最佳方式是交由其他專門處理格式化的語言。你可以使用 Textile

%p
  :textile
    I like *cake*!

或 Markdown

%p
  :markdown
    I like **cake**!

或純粹的 XHTML

%p I like <strong>cake</strong>!

如果你插入的是由輔助程式產生的內容,例如連結,那就更簡單了

%p== I like #{link_to 'chocolate', 'http://franschocolates.com'}!

如何讓 Haml 不要縮排 pretextarea 標籤的內容?

由於 Haml 會自動縮排 HTML 原始碼,因此空白敏感標籤(例如 pretextarea)的內容可能會出錯。解決方法是將這些標籤內的換行符號替換為 HTML 換行實體(&#x000A;),Haml 會使用 Haml::Helpers#preserve 和 Haml::Helpers#find_and_preserve 輔助程式來執行此動作。

通常,當你使用需要此功能的標籤時,Haml 會自動執行此動作(可以使用 :preserve 選項自訂此功能)。例如,

%p
  %textarea= "Foo\nBar"

會編譯為

<p>
  <textarea>
Foo&#x000A;Bar</textarea>
</p>

不過,如果輔助程式產生標籤,Haml 無法偵測,因此你必須自己呼叫 Haml::Helpers#find_and_preserve。你也可以使用 ~,它與 = 相同,但會自動對輸入執行 find_and_preserve。例如

%p= find_and_preserve "<textarea>Foo\nBar</textarea>"

與下列相同

%p~ "<textarea>Foo\nBar</textarea>"

並呈現

<p><textarea>Foo&#x000A;Bar</textarea></p>

如何讓 Haml 文件中的 Ruby 長程式碼看起來更漂亮?

將它們放入輔助程式或模型中。

Haml 故意讓你在範本中放入大量 Ruby 程式碼時感到困擾,因為大量程式碼不屬於檢視。如果你將龐大的 link_to_remote 呼叫移至 update_sidebar_link 輔助程式,這將讓你的檢視更易於閱讀且更具語意。

如果你真的必須在範本中放入大量程式碼,Haml 提供了一個有點尷尬的多行延續工具。在每個你想要合併為一行(包括最後一行!)的行的結尾加上 |(管道字元)。例如

%p= @this.is(way.too.much). |
    code("and I should").   |
    really_move.it.into(    |
      :a => @helper)        |

請注意,當 Ruby 是傳入大量範本資訊的輔助程式呼叫時,有時在範本中包含大量 Ruby 是有效的。因此,當函式有大量引數時,只要每一行以逗號結尾,就可以將它換行。例如

= link_to_remote "Add to cart",
    :url => { :action => "add", :id => product.id },
    :update => { :success => "cart", :failure => "error" }

form_for 列印表單標籤兩次!

請確定你使用 - 而不是 = 來呼叫它。就像在 ERB 中,你必須執行

<% form_for stuff do %>
  ...
<% end %>

在 Haml 中,你必須執行

- form_for stuff do
  ...

我已經安裝了 Haml。為什麼 Rails(只尋找 .html.erb 檔案 | 將 Haml 檔案呈現為純文字 | 將 Haml 檔案呈現為空白頁面)?

發生這些事情的原因有幾個。首先,請確定 Haml 真的已經安裝;您已經載入 gem(透過 Rails 2.3 中的 config.gem 或 Rails 3 中的 Gemfile),或者 vendor/plugins/haml 存在且包含檔案。然後嘗試重新啟動 Mongrel 或 WEBrick 或您可能正在使用的任何東西。

最後,如果這些方法都沒有用,您很可能安裝了某些在地化外掛程式,例如 Globalize。此類外掛程式通常無法與 Haml 正常搭配。幸運的是,通常有一個簡單的解決方法。對於 Globalize,只需編輯 globalize/lib/globalize/rails/action_view.rb 並變更

@@re_extension = /\.(rjs|rhtml|rxml)$/

@@re_extension = /\.(rjs|rhtml|rxml|erb|builder|haml)$/

對於其他外掛程式,稍微搜尋一下可能會找到解決方法。

您仍然沒有回答我的問題!

抱歉!請嘗試查看 Haml 參考,如果您在那裡找不到答案,請隨時在 irc.freenode.net 上的 #haml 中詢問或寄電子郵件至 郵件清單