Как написать условный троичный оператор, встроенный в Ruby on Rails? - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь сравнить 2 значения и изменить цвет одного, когда условие выполняется. Но у меня также есть панель поиска, и я не смог получить доступ к значениям тегов, когда они заключены в оператор <% if%> в моей функции javascript с использованием Rails.

У меня изначально был такой код

 <% if track.user.username == current_user.username%>
   <td class="track_table_current_user">
     <span><%= track.user.username %></span>
   </td>
 <% else %>
   <td class="td-userName"> 
     <span class="track_table_user_name"><%= track.user.username %> </span>
   </td>
 <% end %> 

Моя троица на данный момент:

<td class="track_table_user_name <% track.user.username == current_user.username ? "this_current_user" : "other_user" %>">
    <%= track.user.username %>
</td>

Функция поиска, которая не позволяет получить доступ к значениям, если я использую <% if%> <% else%>:

function trackTableSearch() {
  var input, filter, table, tr, td, i, txtValue;
  input = document.getElementById("trackTableInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("tracksTable");
  tr = table.getElementsByTagName("tr");
  for (i = 0; i < tr.length; i++) {
    tdN  = tr[i].getElementsByClassName("td-trackName")[0];
    tdU = tr[i].getElementsByClassName("track_table_user_name")[0];
    tdR = tr[i].getElementsByClassName("td-trackApproved")[0];
    tdP = tr[i].getElementsByClassName("td-public")[0];
    if ((tdN) || (tdU) || (tdR) || (tdP)) {
      txtValueN  = tdN.textContent  || tdN.innerText;
      txtValueU  = tdU.textContent  || tdU.innerText;
      txtValueA  = tdR.textContent  || tdR.innerText;
      txtValueP  = tdP.textContent  || tdP.innerText;

      if (txtValueN.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      }else if (txtValueU.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else if (txtValueA.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      }else if (txtValueP.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      }else{
        tr[i].style.display = "none";
      }
    }
  }

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

Возможно, вы захотите сделать что-то вроде:

<td class="<%= track.user.username == current_user.username ? "track_table_current_user" : "td-userName" %>">
    <%= track.user.username %>
</td>

См. этот ответ , чтобы узнать, как использовать троичный оператор, он работает примерно одинаково на всех языках.

1 голос
/ 25 июня 2019

Я бы не использовал здесь троичный оператор, потому что это делает ваш шаблонный код намного более трудным для чтения.Вместо этого я бы сделал заявление if-else.Тернарный оператор действительно хорош для очень коротких операторов if-else, но особенно в визуализированном коде мы хотим уменьшить всю возможную логику, а когда это невозможно, мы хотим, чтобы ее было как можно проще анализировать.

Это гораздо проще разобрать:

<% if track.user.username == current_user.username %>
  <td class="track_table_user_name <%= this_current_user %>>
<% else %>
  <td class="track_table_user_name <%= other_user %>>
...

Я бы даже зашел так далеко, чтобы сделать переменную @rendered_username в контроллере, чтобы вам не приходилось выполнять эту логику.

0 голосов
/ 25 июня 2019

Я понял это ... Я не хочу признавать это, но я забыл символ '=' ... угадать почему!?!?!

<td class="track_table_user_name \
    <% ***(right here)*** track.user.username == current_user.username ? "this_current_user" : "other_user" %>">
     <%= track.user.username %>
    </td>

Спасибо всем за вашу помощь и .inspect, и за то, что поместили переменную в контроллер.

Мой рабочий финал:

<td class="track_table_user_name <%= (track.user.username == current_user.username) ? "this_current_user" : "other_user" %>"><%= track.user.username %></td>
...