2016-06-29 5 views
0

Ich habe eine Show-Seite, auf der ich die Einheiten des Schülers zeigen und eine Einheit für sie erstellen muss. Beim Versuch, beides zu tun, tritt jedoch ein Fehler auf.Konfliktlogik

In meinem Controller

def show 
    @student = Student.find(params[:id]) 
    @unit = @student.units.build 
    @units = @student.units 
end 

Meiner Ansicht

<%= 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 %> 

Die unit.course Anruf funktioniert und jeder Anruf, der nur das erste Kind der Einheit ist, aber wenn ich ein zweites Verfahren rufen Einheit bekomme ich diesen Fehler:

undefined method `strftime' for nil:NilClass 

obwohl er wusste, dass das Gerät vorhanden ist, daher der erste Anruf wo rking

+1

Ist mailing_date Null zu entfernen? – hypern

Antwort

0

Ihr Problem ist, dass unit.mailing_datenil ist, für neu erstellte Datensätze.

Eine Lösung wäre define a default value for mailing_date, entweder auf Datenbankebene oder in Ihrer Anwendung. Zum Beispiel könnte man so etwas tun:

class Unit < ActiveRecord::Base 
    # .... 
    after_initialize :set_default_mailing_date 

    private 
    def set_default_mailing_date 
    self.mailing_date ||= Date.today 
    end 
end 

Oder alternativ könnten Sie die mailing_date als nil und behandeln diese anmutig in der Ansicht verlassen:

<td><%= unit.mailing_date.try!(:strftime, '%m/%d/%y') %></td> 

Wenn Sie mit Ruby-Version 2.3+, dann ich würde Ihnen raten, die built-in safe navigation operator, anstatt ActiveSupport ‚s try! Methode:

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

Schließlich, wenn Sie mit der obigen Wahl ging vielleicht die mailing_date als nil, verlassen dann möchten Sie einige Standardwert an seiner Stelle angezeigt werden - zum Beispiel:

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

Als Alternative ich nehme an, Sie don Ich möchte nicht, dass die neue Einheit, die an das Formular gebunden ist, gerendert wird, wodurch der Fehler verursacht wird.

Sie könnten tun

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

die neu gebaute Einheit aus der Sammlung in diesem Fall