【问题标题】:Rails 4. Undefined method `strftime' for nil:NilClass for created_at fieldRails 4.nil的未定义方法`strftime':created_at字段的NilClass
【发布时间】:2015-08-23 22:29:00
【问题描述】:

只是一个简单的数据记录应用程序,用于在 Rails 4 中记录和显示时间表条目。在意识到我的时区记录的时间条目提前 2 小时后,我将 config.time_zone 和 config.active_record.default_timezone 值设置为分别是“柏林”。

但是,在这次 hack 之后,ActiveRecord 开始将毫秒数据添加到“created_at”sqlite-DB 列中,因此在我显示创建日期时间时会引发“nil:NilClass 的未定义方法 `strftime'”错误. 这就是我的不良观点:

<table>
    <% @timesheets.each do |t| %>
        <tr>
        <td><%= t.user.name %></td>
        <td><%= t.t_lines %> sor</td>
        <td><%= t.t_time %> perc</td>
        <td><%= t.created_at.strftime('%Y.%m.%d %H:%M') %></td>
        </tr>
    <% end %>
</table>

有没有办法停止轨道记录精确时间数据,或其他解决方案? 提前致谢!

【问题讨论】:

  • 您尝试打印的记录是否在您的数据库中设置了 created_at 列?
  • 是的,确实如此,通过 Rails 的迁移自动时间戳。
  • 在开头执行def nil.strftime; end,错误就会消失。

标签: ruby-on-rails-4 activerecord strftime


【解决方案1】:
t.created_at.try(:strftime,'%Y.%m.%d %H:%M')

【讨论】:

  • 感谢 aromero 的提示,这至少可以修复错误,但是对于 created_at 字段根本没有输出。
  • 在这种情况下您会期待什么?值为 nil
  • 这是我的期望,但是我不明白为什么复杂的框架会将 nil 值放入数据库,以及为什么不能禁用此功能。
【解决方案2】:

你可以使用这样的条件:

   <% if t.created_at.present? %>
        <td><%= t.created_at.strftime('%Y.%m.%d %H:%M') %></td>
    <% else %>
        <td><p> Time Not Available </p></td>
    <% end %>

【讨论】:

  • 感谢 K M Rakibul Islam,我当然可以,但我更愿意简单地显示一个格式化的 'created_at' 值。 :-)
【解决方案3】:

在找到解决方案之前进行了大量研究。我也尝试过完整的数据库重置但没有成功。 然后我找到了这个:

Rails 4 model returns always nil

application.rb 中 config.active_record.default_timezone 的值不能设置为特定的时区,而是设置为 :local 或 :utc 之类的符号。

application.rb:

config.time_zone = 'Berlin'
config.active_record.default_timezone = :local

这个改变和进一步的 db:reset 解决了这个问题。 感谢您的贡献。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多