我有一个展示页面,我需要显示学生的单位并为他们创建一个单元。但是,尝试同时执行这两项操作时会发生错误。
在我的控制器中
def show
@student = Student.find(params[:id])
@unit = @student.units.build
@units = @student.units
end
在我看来
<%= simple_form_for @unit, url: student_units_path(@student) %>
# form...
<% end %>
<% @units.each do |unit| %>
<tr>
<td><%= unit.course %></td>
<td><%= unit.mailing_date.strftime('%m/%d/%y') %></td>
</tr>
<% end %>
unit.course调用有效,任何调用只是单元的第一个子节点,但是当我在单元上调用第二个方法时,我会收到此错误:
undefined method `strftime' for nil:NilClass
尽管知道该单位存在,因此第一次呼叫工作
答案 0 :(得分:0)
对于新建的记录,您的问题似乎是unit.mailing_date
是nil
。
一个解决方案是define a default value for mailing_date
,无论是在数据库级别还是在您的应用程序中。例如,您可以执行以下操作:
class Unit < ActiveRecord::Base
# ....
after_initialize :set_default_mailing_date
private
def set_default_mailing_date
self.mailing_date ||= Date.today
end
end
或者,您可以将mailing_date
保留为nil
并在视图中正常处理:
<td><%= unit.mailing_date.try!(:strftime, '%m/%d/%y') %></td>
如果您使用的是ruby版本2.3+
,那么我建议您使用built-in safe navigation operator,而不是ActiveSupport
try!
方法:
<td><%= unit.mailing_date&.strftime('%m/%d/%y') %></td>
最后,如果您按照上述选择将mailing_date
保留为nil
,那么您可能希望在其位置显示一些默认值 - 例如:
<td><%= unit.mailing_date&.strftime('%m/%d/%y') || 'Not set' %></td>
答案 1 :(得分:0)
作为替代方案,我假设您不希望新单元绑定到正在渲染的表单,这是导致错误的原因。
你可以做到
@units = @student.units.reject(&:new_record?)
从集合中删除新构建的单元