冲突的视图逻辑

Conflicting View Logic

我有一个展示页面,我需要在其中展示学生的单元并为他们创建一个单元。但是,当尝试同时执行这两项操作时会发生错误。

在我的控制器中

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

尽管知道该单元存在,因此第一个调用有效

您的问题似乎是 unit.mailing_datenil,用于新建记录。

一种解决方案是 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,而不是 ActiveSupporttry! 方法:

<td><%= unit.mailing_date&.strftime('%m/%d/%y') %></td>

最后,如果您按照上述选择将 mailing_date 保留为 nil,那么您可能希望在其位置显示一些默认值 - 例如:

<td><%= unit.mailing_date&.strftime('%m/%d/%y') || 'Not set' %></td>

作为替代方案,我假设您不希望新单元绑定到正在呈现的表单,这就是导致错误的原因。

你可以

@units = @student.units.reject(&:new_record?)

从collection

中删除新建单元