我试图在生成的行上输出日期,但是当我执行这段代码时,我确信它根本不优雅,它给了我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
对象上。确保你在strftime
,date
或time
对象上调用datetime
。
请参阅rails apidock上的strftime
- https://apidock.com/ruby/DateTime/strftime
另一种解决这个问题的方法是防范nil
s:
<%= sub.startdate&.strftime("%Y") %> - <%= sub.graddate&.strftime("%Y") %>
这样您就不必添加条件来确保在调用链之前存在链中的任何方法/属性。这是因为安全的导航操作符,这里有详细解释:https://rubyinrails.com/2017/11/17/safe-navigation-operator-ampersand-dot-in-ruby/