我的问题与此问题非常相似: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
不正确,我不明白为什么......
感谢您的帮助!
答案 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
这种逻辑适用的方法。