我有一个更简洁的 nav_link 版本,它的工作方式与 link_to 完全相同,但经过定制以输出包装 li 标记。
将以下内容放入您的 application_helper.rb
def nav_link(*args, &block)
if block_given?
options = args.first || {}
html_options = args.second
nav_link(capture(&block), options, html_options)
else
name = args[0]
options = args[1] || {}
html_options = args[2]
html_options = convert_options_to_data_attributes(options, html_options)
url = url_for(options)
class_name = current_page?(url) ? 'active' : nil
href = html_options['href']
tag_options = tag_options(html_options)
href_attr = "href=\"#{ERB::Util.html_escape(url)}\"" unless href
"<li class=\"#{class_name}\"><a #{href_attr}#{tag_options}>#{ERB::Util.html_escape(name || url)}</a></li>".html_safe
end
end
如果您查看上面的代码并将其与 url_helper.rb 中的 link_to 代码进行比较,唯一的区别是它检查 url 是否为当前页面,并将“活动”类添加到包装 li 标记中。这是因为我将 nav_link 助手与 Twitter Bootstrap 的 nav component 一起使用,它更喜欢将链接包裹在 li 标签内,并将“活动”类应用于外部 li。
上述代码的好处在于它允许您将一个块传递给函数,就像您可以使用 link_to 一样。
例如,带有图标的引导导航列表如下所示:
苗条:
ul.nav.nav-list
=nav_link root_path do
i.icon-home
| Home
=nav_link "#" do
i.icon-user
| Users
输出:
<ul class="nav nav-list">
<li class="active">
<a href="/">
<i class="icon-home"/>
Home
</a>
</li>
<li>
<a href="#">
<i class="icon-users"/>
Users
</a>
</li>
</ul>
另外,就像 link_to 助手一样,你可以将 HTML 选项传递给 nav_link,这将应用于 a 标签。
为锚点传入标题的示例:
苗条:
ul.nav.nav-list
=nav_link root_path, title:"Home" do
i.icon-home
| Home
=nav_link "#", title:"Users" do
i.icon-user
| Users
输出:
<ul class="nav nav-list">
<li class="active">
<a href="/" title="Home">
<i class="icon-home"/>
Home
</a>
</li>
<li>
<a href="#" title="Users">
<i class="icon-users"/>
Users
</a>
</li>
</ul>