2017-08-12 74 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,是的,保持现有的约定是比现在甚至全部使用关键字更大的问题:) –

相关问题