2017-08-12 72 views
2

許多Rails標記助手(例如content_tag等)使用名爲class的散列選項參數來指定HTML類。是否有可能在Ruby中有一個名爲`class`或其他保留名稱的關鍵字參數?

content_tag(:div, content_tag(:p, "Hello world!"), class: "strong") 

對於新的代碼,我想用關鍵字參數,但是是可能的,當他們中的一個是語言的關鍵字?

例如對於假設的link_tag

def link_tag(url, class: nil) 
    html = '' 
    html << '<a href="' << url << '"' 
    html << ' class="' << class << '"' if class 
    ... 


def link_tag(url, opts={}) 
    html = '' 
    html << '<a href="' << url << '"' 
    html << ' class="' << opts[:class] << '"' if opts[:class] 
    ... 
+3

不,這是不可能的。在Ruby中,通常使用'klass'或'clazz'來代替。 –

+0

Rails是否有約定,或者他們會繼續使用「opts = {}」? –

+1

我想到了一個方法來做到這一點。雖然這很醜陋。把它作爲一個完整的答案。 –

回答

7

的種類。不過,您必須通過避免代碼中的文字關鍵字來避免混淆Ruby詞法分析器。在Ruby 2.2+,讓您可以將其與binding.local_variable_get

def link_tag(url, class: nil) 
    format('<a href="%s" class="%s"></a>', url, binding.local_variable_get(:class)) 
end 

link_tag("http://stackoverflow.com", class: "fancy") 
# => "<a href=\"http://stackoverflow.com\" class=\"fancy\"></a>" 

這是不是真的做的事情,但非常乾淨的方式,而且很可能會造成混亂。如果我要使用關鍵字參數(即css_class或傳統的klass等),我會嘗試將我的參數重命名爲不與語言衝突。

+2

這適用於其他人不關心實現的情況,他們對此不負責,並且您只是試圖創建一個乾淨的,一致的API。 – tadman

+1

我相信,在Ruby bug跟蹤器上有關於這個問題的討論,關於可能爲局部變量添加一些可選的sigil,或者轉義關鍵字的一般方式(類似於Scala使用反引號)。 –

+0

@tadman,是的,保持現有的約定是比現在甚至全部使用關鍵字更大的問題:) –

相關問題