在Rails ERB视图中,如何防止下划线转换为连字符?

时间:2017-02-03 23:49:03

标签: ruby-on-rails erb

在ERB视图中包含以下代码:

<%= content_tag(:div, id: 'stat', data: {_var_: '_foo_'}) %>

生成以下HTML:

<div id="stat" data--var-="_foo_">
</div>

我的目的是获得

<div id="stat" data-_var_="_foo_">
</div>

即。我不想要

data--var-

但是

data-_var_

我怎么能实现这个目标呢?

1 个答案:

答案 0 :(得分:3)

ActionView :: Helpers :: TagHelper docs所示:

  

为了很好地使用JavaScript约定子属性   底线转换即可。例如,密钥 user_id 将呈现为 data-user-id   并因此作为dataset.userId。

访问

为了说明,您可以检入 Rails源代码tag_helper.rbprefix_tag_option调用key.to_s.dasherize

def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
    #...#
    content_tag_string(name, content_or_options_with_block, options, escape)
    #...#
end

def content_tag_string(name, content, options, escape = true)
    tag_options = tag_options(options, escape) if options
    #...#
end

def tag_options(options, escape = true)
    # ...
    # TAG_PREFIXES = ['aria', 'data', :aria, :data].to_set
    # invoke prefix_tag_option only if it's a data- sub-attributes 
    if TAG_PREFIXES.include?(key) && value.is_a?(Hash) 
        #...#
        output << prefix_tag_option(key, k, v, escape)
    end
    #...#
end


def prefix_tag_option(prefix, key, value, escape)
    key = "#{prefix}-#{key.to_s.dasherize}"
    #...#
end

如果您不想 dasherize 您的密钥,可能解决方法是直接设置data-attribute在选项哈希中,如下所示:

<%= content_tag(:div, "test", { id: 'stat', 'data-_var_': '_foo_' }) %>

这样,Rails将呈现:

<div id="stat" data-_var_="_foo_">test</div>