Рельсы для формата даты выпуска - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь вывести только дату в сгенерированной строке, но когда я выполняю этот код, который, я уверен, совсем не элегантен, он дает мне 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") без каких-либо проблем, но я думаю, что моя проблема в том, что я использую дополнительный вызов, который захватывает всех людей, помеченных как подчиненные этому человеку.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Ваша ошибка говорит о том, что одним из ваших атрибутов является ноль. Синтаксис правильный. Попробуйте отладить с помощью:

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

0 голосов
/ 30 октября 2018

Еще один способ решить эту проблему, который защитит от nil с, будет:

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

Таким образом, вам не нужно добавлять условие, чтобы убедиться, что какой-либо метод / атрибут в цепочке существует до их вызова. Это работает из-за оператора безопасной навигации, который подробно объясняется здесь: https://rubyinrails.com/2017/11/17/safe-navigation-operator-ampersand-dot-in-ruby/

0 голосов
/ 30 октября 2018

strftime вызывается для nil объекта. Убедитесь, что вы вызываете strftime для date, time или datetime объекта.

См. strftime на рельсах apidock - https://apidock.com/ruby/DateTime/strftime

...