日期格式问题的Rails

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日期格式问题的Rails相关的知识,希望对你有一定的参考价值。

我试图在生成的行上输出日期,但是当我执行这段代码时,我确信它根本不优雅,它给了我undefined method 'strftime' for nil:NilClass

<% @person.subordinates.each do |sub| %>
  <tr>
    <td>
      <% if sub.position == 'alumni' %>
        <p>
          <%= link_to(sekret_person_path(sub.position, sub.user_name)) do %>
            <strong><%= sub.fname %> <%= sub.lname %>,</strong>
          <% end %> <%= sub.startdate.strftime("%Y") %> - <%= sub.graddate.strftime("%Y") %>
        </p>   
      <% end %>
    </td>
  </tr>
<% end %>

进一步在我的代码中,我使用@person.startdate.strftime("%m/%d/%Y")没有任何问题,但我认为我的问题是我正在使用子调用,它抓住任何标记为此人的子调用。

答案

您的错误表明您的某个属性为零。语法是正确的。尝试调试:

@person.subordinates.select { |sub| sub.startdate.nil? || sub.graddate.nil? }

在这一行检索的元素将是那些给你错误的元素,因为你试图运行nil.strftime('%Y'),这是有道理的。

您应该使用.erb上的条件来阻止它,例如:

<%= sub.startdate && sub.startdate.strftime("%Y") %> - <%= sub.graddate && sub.graddate.strftime("%Y") %>

这不是Rails的错误。

另一答案

strftime被召唤在nil对象上。确保你在strftimedatetime对象上调用datetime

请参阅rails apidock上的strftime - https://apidock.com/ruby/DateTime/strftime

另一答案

另一种解决这个问题的方法是防范nils:

<%= sub.startdate&.strftime("%Y") %> - <%= sub.graddate&.strftime("%Y") %>

这样您就不必添加条件来确保在调用链之前存在链中的任何方法/属性。这是因为安全的导航操作符,这里有详细解释:https://rubyinrails.com/2017/11/17/safe-navigation-operator-ampersand-dot-in-ruby/

以上是关于日期格式问题的Rails的主要内容,如果未能解决你的问题,请参考以下文章

Rails 日期选择器日期时间的有效格式

更改 Rails 4 中的默认日期和时间格式

Rails:播种数据库数据和日期格式

ActiveRecord / Rails 3 中的日期格式

Rails 3.2 - best_in_place - 编辑时的日期值格式问题

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?