Добавить выбранный класс в ссылки в зависимости от идентификатора - PullRequest
1 голос
/ 31 августа 2011

Мой вопрос очень похож на этот: Изменение текущей вкладки в Rails

Я пытаюсь добавить в свою ссылку «выбранный» класс относительно id действия show контроллера моего портфеля

Вот что я пробовал:

<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 ]

1 голос
/ 31 августа 2011

Осторожно: параметры всегда являются строками.

Итак:

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

SideNote: извлекайте такую ​​логику в помощниках, она намного чище.

0 голосов
/ 31 августа 2011

Возможно, вы сравниваете строковые и числовые значения, которые в 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 в любомметод контроллера, где применяется эта логика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...