常見問題集
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 不要縮排 pre
和 textarea
標籤的內容?
由於 Haml 會自動縮排 HTML 原始碼,因此空白敏感標籤(例如 pre
和 textarea
)的內容可能會出錯。解決方法是將這些標籤內的換行符號替換為 HTML 換行實體(

),Haml 會使用 Haml::Helpers#preserve 和 Haml::Helpers#find_and_preserve 輔助程式來執行此動作。
通常,當你使用需要此功能的標籤時,Haml 會自動執行此動作(可以使用 :preserve
選項自訂此功能)。例如,
%p
%textarea= "Foo\nBar"
會編譯為
<p>
<textarea>
Foo
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
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
中詢問或寄電子郵件至 郵件清單。