如何在rails上的ruby中更改不同页面的锚类?

时间:2011-09-10 00:30:48

标签: ruby-on-rails menu anchor

我的应用程序布局中有一个菜单 说

 <ul>
    <li><a href="index.asp">Home</a></li>
    <li><a href="dashboard.asp">Dashboard</a></li>
    <li><a class="active" href="/people">People</a></li>
 </ul>

现在我想从不同的页面更改不同锚点的类...对于主页来说它会像...

  <ul>
     <li><a class="active" href="index.asp">Home</a></li>
     <li><a href="dashboard.asp">Dashboard</a></li>
     <li><a href="/people">People</a></li>
  </ul>

如何实现这一目标?顺便说一下,我是ror的新手。

4 个答案:

答案 0 :(得分:1)

这可以按照以下方式完成。

编写一个帮助器方法来执行此操作(辅助方法用于为演示文稿布局执行一些简单的函数,这是一个理想的情况)。

在Rails中,您可以将当前正在执行的控制器名称作为

params[:controller]

并以

执行操作
params[:action] 

因此,在您的应用程序助手中,您可以编写类似

的内容
module ApplicationHelper
  def active_link (link)
    (link == params[:controller]) ? "active" : ""
  end
end

在上面的示例中,如果当前控制器与当前链接匹配,则它将返回一个字符串为“active”,否则返回一个空字符串

最后在您看来,

<ul>
     <li><a class="<%= active_link('home') %>" href="index.asp">Home</a></li>
     <li><a href="<%= active_link('dashbord') %>">Dashboard</a></li>
     <li><a href="<%= active_link('people') %>">People</a></li>
</ul>

备注

  • 此解决方案假定您具有匹配名称的控制器 对于每个链接。
  • 我没有对此进行测试,但应该正常工作,但这应该是 概念

答案 1 :(得分:0)

执行此操作的一种方法是从控制器传递实例变量。例如,如果您被发送到主页:

class Pages < ApplicationController
  def index
    @active = "index"
  end
end

现在,当您进入导航视图时,您会执行以下操作:

<li><a class="<%= "active" if @active == "index" %>" href="index.asp">Home</a></li>

答案 2 :(得分:0)

对于它的价值,你也可以覆盖link_to

def link_to(*args, &block)
  options_key, html_key = block_given? ? [0, 1] : [1, 2]

  args[html_key] ||= {}
  args[html_key][:class] = [args[html_key][:class], "active"].compact.join(' ') if current_page?(args[options_key])

  super(*args, &block)
end

你可以像这样使用它:

<ul>
    <li><%= link_to "Home", "index.asp" %></li>
    <li><%= link_to "Dashboard", "dashboard.asp" %></li>
    <li><%= link_to "People", "/people" %></li>
</ul>

答案 3 :(得分:0)

有一个link_to_unless_current帮助器可以满足您的需求,但并不总是如预期的那样 - 它忽略了查询参数。但是,如果所有链接指向不同的操作/控制器,那应该这样做。