【问题标题】:Rails 3 each do ignore nil valuesRails 3 每个都忽略 nil 值
【发布时间】:2013-02-07 01:05:15
【问题描述】:

我正在构建一个 html 表,其中应包含 name、rating1、rating2 和 rating3。评级 1-3 来自与名称不同的型号。

resources :names do
  resource :rat1,:rat2,:rat3
end

在我的 html 表中,我想在每个表中包含评级,但我想自动跳过或忽略为 nil 的表。这是因为 :names 可能只有 :rat1 而不是 :rat2 或 :rat3。我的视图应该是这样的。

    <table>
      <thead>Name</thead>
      <thead>Rating 1</thead>
      <thead>Rating 2</thead>
      <thead>Rating 3</thead>
      <% @names.each do |name| %>
        <tr>
          <td><%= name.nametext %></td>
          <td><%= name.rat1.rating %></td>
          <td><%= name.rat2.rating %></td>
          <td><%= name.rat3.rating %></td>
        </tr>
      <% end %>
    </table>

除非 name.rat1 为 nil,否则它将 a.) 将值替换为 N/A 或 b.) 它将将此字段留空并继续下一个。

最干净的方法是什么?

::更新::

所以我的问题是 name.rat1 是 nil 并且 name.rat1.rating 是 nil 类的未定义方法,因此这两个选项将抛出相同的 nil 类未定义方法错误,而不管 ||或辅助方法。至少这就是我目前的测试所显示的。还有其他选择吗?或不同的解决方法?我想避免为每个 rat1-3 放置一个这样的验证循环

<% unless name.rat1.nil? %>
  <%= name.rat1.rating %>
<% end %>

必须有一个更简单的方法。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    我可能会在 names_helper.rb 中创建一个辅助方法

    def show_rating(rating)
      if rating.present?
        rating
      else
        "default value"
      end
    end
    

    然后在视图中使用它:

    <%= show_rating name.rat1.rating %>
    

    【讨论】:

    • 好建议!我想我已经围绕这个概念跳舞了一段时间。这将大大简化事情。
    • 如果我想把它放在一个 xml.tag 里面!就像这样xml.tag!("cell", show_rating(name.rat1.rating)) 你希望这能奏效吗?我尝试时似乎没有。
    • 如果您要在多个地方(视图、控制器、模型、构建器等)使用它,您可能需要考虑使用模型方法。
    • 见上面的更新。我认为这是我需要做的。只是不确定具体的实现。
    【解决方案2】:

    OFFTOPIC 你的表结构不对。它应该有&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Rating1&lt;/th&gt;..so on..&lt;/tr&gt;&lt;/thead&gt;

    因此,在您的情况下,您可以在将评级值呈现为时使用条件:

    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Rating 1</th>
          <th>Rating 2</th>
          <th>Rating 3</th>
        </tr>
      </thead>
      <tbody>
      <% @names.each do |name| %>
        <tr>
          <td><%= name.nametext %></td>
          <td><%= name.rat1.rating || 'N/A' %></td>
          <td><%= name.rat2.rating || 'N/A' %></td>
          <td><%= name.rat3.rating || 'N/A' %></td>
        </tr>
      <% end %>
      </tbody>
    </table>
    

    【讨论】:

    • 感谢您的帮助。是的,结构做得不对。它实际上不是我的代码的一部分。我只是想要一个简化的例子。扔在一起。
    • 谢谢 :) 我只是想指出这一点,以便您了解。 :)
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-08-18
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多