【问题标题】:How do you write a conditional ternary operator inline in Ruby on Rails?如何在 Ruby on Rails 中内联编写条件三元运算符?
【发布时间】:2019-11-06 17:44:51
【问题描述】:

我正在尝试比较 2 个值并在条件成立时更改其中一个的颜色。 但是我也有一个搜索栏,当它使用 Rails 包装在我的 javascript 函数中的 语句中时,我无法访问标记值。

我原来的代码是这样的

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

如果我使用 则无法访问值的搜索功能:

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";
      }
    }
  }

【问题讨论】:

  • 你的第二个代码没有设置与第一个代码相同的类,我不确定我理解你的问题,三元运算符有什么问题?它不工作吗?我想我会把这个逻辑转移到一个助手身上
  • 是的,第一次是在我更改类名之前。我的代码内联中有其他三元组,但使用 == 和 2 个 标签似乎并没有改变我正在调用的 css 类。

标签: ruby-on-rails ruby if-statement conditional-statements ternary


【解决方案1】:

你可能想做这样的事情:

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

请参阅this answer 了解如何使用三元运算符,它在所有语言中的工作原理大致相同。

【讨论】:

  • 尼克,这正是我所拥有的,但它不起作用。在我问这个问题之前,我肯定读过。由于某种原因,使用 == 不起作用。
  • “不工作”是什么意思?你有错误吗?它会产生错误的结果吗?如果有,结果如何?您可能需要输入诊断信息&lt;%= (track.user.username == current_user.username).inspect) %&gt;
  • 我以前从未使用过 .inspect 吗?我会查查的。 (我已经编码一年多了)感谢您的帮助。
【解决方案2】:

我不会在这里使用三元运算符,因为它会使您的模板代码更难阅读。相反,我会做一个 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 变量,这样您就不必执行任何此类逻辑。

【讨论】:

  • 我已经有了这个,但它弄乱了我的搜索功能,因为我无法访问 值。我喜欢在控制器中添加@rendered_name 作为解决方法。
  • 通常,视图和模板中的逻辑应为 0。在这种情况下,@rendered_name 与其说是设计视图的更好方法,不如说是一种解决方法。一旦你养成了这个习惯,调试视图逻辑就会变得容易得多。
  • 我不会调试为什么你不能访问&lt;td&gt; 值(你的意思是类值吗?),我会先从这种方法开始,然后问一个问题,如果不是按预期工作。
  • 我在上面的代码中添加了我的搜索功能。 --- 如果我使用 ruby​​ if 语句,我会得到未定义的值。我想我可以用内联方式编写它。我的意思是 或 class 因为我正在使用 getElelmentsByClassName() 并且我也尝试过 querySelectorAll()
【解决方案3】:

我想通了......我不想承认这一点,但我忘记了“=”符号...... uggggg 为什么!?!?!

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

【讨论】:

  • 既然你已经让它工作了,你会考虑将逻辑从视图中分离出来并进入控制器(或助手)吗?
  • 这是更好的做法吗?我用正在填充的轨道做到了这一点,但我认为名称的颜色变化可以留在 html 中。我希望得到建议或指导。
  • 是的,您希望尽可能减少视图中的逻辑。不仅测试非常困难,而且现在你有另一个 [通常是混乱的] 层可以在事情不工作时进行调试。尝试谷歌搜索“rails 视图逻辑”,你会看到一堆文章讨论如何绕过将逻辑放入视图中的方法:)
猜你喜欢
相关资源
最近更新 更多
热门标签