日期格式问题的Rails

问题描述 投票:-1回答:3

我试图在生成的行上输出日期,但是当我执行这段代码时,我确信它根本不优雅,它给了我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")没有任何问题,但我认为我的问题是我正在使用子调用,它抓住任何标记为此人的子调用。

ruby-on-rails ruby-on-rails-4 formatting
3个回答
2
投票

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

@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的错误。


2
投票

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

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


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.