冲突的视图逻辑

时间:2016-06-29 14:33:32

标签: ruby-on-rails ruby simple-form

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

在我的控制器中

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

尽管知道该单位存在,因此第一次呼叫工作

2 个答案:

答案 0 :(得分:0)

对于新建的记录,您的问题似乎是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,而不是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?)

从集合中删除新构建的单元