根据ID将所选类添加到链接

时间:2011-08-30 20:39:31

标签: ruby-on-rails

我的问题与此问题非常相似:Changing Current Tab in Rails

我正在尝试在我的链接中添加一个“已选择”类,其中包含有关我的投资组合控制器展示操作的 id

这是我尝试过的:

<ul>
  <% for portfolio in @portfolios %>
    <li class="<%= controller.class == PortfoliosController and controller.action_name == 'show' and controller.params[:id] == portfolio.id ? 'selected' : '' %>"><%= link_to portfolio.name, portfolio %></li>
  <% end %>
</ul>

但似乎有以下几点:

controller.params[:id] == portfolio.id

不正确,我不明白为什么......

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

注意:params总是字符串。

所以:

 controller.params[:id].to_i == portfolio.id

SideNote:在助手中提取这种逻辑,它更清晰。

答案 1 :(得分:0)

您可能正在比较字符串和数值,这些值在Ruby中不被视为等效。转换其中一个或另一个可能会有所帮助。事实上,如果你用一个辅助方法进行推广,可能会让它更容易理解:

def class_for_porfolio_entry(portfolio)
  controller.class == PortfoliosController and
    controller.action_name == 'show' and
    controller.params[:id].to_i == portfolio.id ?
      'selected' :
      ''
end

你已经完成了很多工作,所以你可能想看看降低复杂性的方法,例如使用params代替:

def class_for_porfolio_entry(portfolio)
  params[:controller] == 'portfolios' and
    params[:action] == 'show' and
    params[:id].to_i == portfolio.id ?
      'selected' :
      ''
end

如果您在控制器中设置了一个布尔标志,稍后可以根据需要使用,可以进一步简化这一点,避免硬编码:

def class_for_porfolio_entry(portfolio)
  if (@show_selected_portfolio and @portfolio.id == portfolio.id)
    'selected'
  else
    ''
  end
end

这假设您有一个实例变量@portfolio,这通常是任何控制器的show方法中的情况,并且您将在任何控制器中将@show_selected_portfolio设置为true这种逻辑适用的方法。