Ruby on rails 根据id将选定类添加到链接

Ruby on rails 根据id将选定类添加到链接,ruby-on-rails,Ruby On Rails,我的问题与此非常相似: 我正在尝试将一个“选定”类添加到我的链接中,该链接与我的投资组合控制器的show action的id有关 以下是我尝试过的: <ul> <% for portfolio in @portfolios %> <li class="<%= controller.class == PortfoliosController and controller.action_name == 'show' and controller.par

我的问题与此非常相似:

我正在尝试将一个“选定”类添加到我的链接中,该链接与我的投资组合控制器的show action的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>
不匹配,我不明白为什么


谢谢你的帮助

注意:参数总是字符串

因此:


旁注:在helpers中提取这种逻辑,它更干净。

注意:参数总是字符串

因此:


旁注:在helpers中提取这种逻辑,它更干净。

您可能正在比较字符串和数值,而在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\u selected\u portfolio
设置为
true

您可能正在比较字符串和数值,在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\u selected\u portfolio
设置为
true