Ich spreche von dem, was ich beobachtet habe, und muss nicht unbedingt die Rails-Konvention.
Wenn wir rails g post title content:text
zum Beispiel tun, können Sie sich daran erinnern, dass es nicht default: ''
für beide Titel hat (string) und Inhalt (Text). Dies ist für mich bereits ein Hinweis darauf, dass es diesbezüglich keine Rails-Konvention gibt, oder spezifisch gesagt, dass jedes Attribut standardmäßig NULL oder NULL sein darf.
Der Vorteil der Verwendung von NULL besteht darin, dass Sie feststellen können, für welche Datensätze diese Attribute eingerichtet sind.
Nehmen wir an, wir haben einen API-Server. Wenn ein Client einen Post auf unserem API-Server erstellt, wissen wir, welche Attribute einen Wert haben sollen.Sagen wir mal so etwas wie die folgenden:
Client-1 POST params:
post: {title: 'Foo bar'}
- wenn NULL-zulässig, erstellt eine
Post(title: 'Foo bar', content: nil)
- wenn default: '', eine
Post(title: 'Foo bar', content: '')
schaffen
Client-2 POST params:
post: {title: 'Foo bar', content: ''}
- wenn NULL-zulässig, wird eine
Post(title: 'Foo bar', content: '')
- erstellen, wenn Standard: '', wird ein
Post(title: 'Foo bar', content: '')
Von oben schaffen, feststellen, dass, wenn wir Standard haben: '', dann können wir nicht wissen, wenn der Client tatsächlich einen leeren content
Wert haben möchte, weil für client-1 und client-2 der resultierende content
Wert für den Post sowieso '' (leer) ist. Aber wenn wir NULL-erlaubte Attribute haben, können wir immer noch identifizieren, ob der Client keinen content
Wert haben wollte, indem er das Attribut in den Parametern nicht eingibt. Dies ist ein wichtiger Anwendungsfall.
Abhängig von Ihrem Projekt und dem Zweck des Attributs können Sie entweder NULL-zulässig verwenden oder eine leere Standardzeichenfolge für dieses Attribut festlegen.
Nun, das ein Hauptproblem bei der NULL-zulässig, wie Sie festgestellt haben, ist, dass Sie nicht garantieren können, dass jeder Wert ein String
sein wird, deshalb Ihr <%= @user.profile.location.upcase %>
einen Fehler in Fall erhöhen location
NULL oder null ist.
Dies kann ein wenig lästig sein, besonders wenn man
<%= @user.profile.location.upcase.downcase %>
Dies wird ein Problem sein, wenn @user.profile.location
nil eine Kette von Methoden wie Ihr Beispiel hat, weil Sie anmutig werden müssen, um sicherzustellen, dass es ‚gewonnen t einen Fehler melden. Und das wird auch ein Problem sein, wenn @user.profile
ist Null (lassen Sie uns einfach sagen, Sie lassen @user.profile
zu Null sein). Und in der Regel werden Sie so etwas wie die folgenden tun, um diese Arbeit zu machen:
<% if [email protected]? && [email protected]? %>
<%= @user.profile.location.upcase.downcase %>
<% end %>
Der if
Zustand kann noch weitergehen sehr lange, wie Sie länger angekettet Methoden muß anmutig sicherzustellen, dass es nicht einen Fehler machen.
Verwenden Sie .try()
wird möglicherweise "sauber" dies. Ich benutze das oft in Vorlagendateien. Lösung wird sauberer sein wie unten, wenn auch möglicherweise für diejenigen verwirrend, die nicht wissen:
<%= @user.profile.try(:location).try(:upcase).try(:downcase) %>
Wenn entweder .location
oder .upcase
Null ist, wird es Null zurück und keine undefined method ... for NilClass
mehr erhöhen.
können Sie Validierung für diese –
Amol schreiben, danke für die Antwort, aber das war nicht meine Frage. Ich würde gerne wissen, was die Konvention ist und warum. –
Das hat mich immer auch gestört. Für besser vorhersagbare Daten (leer ist 'NULL') verwende ich immer den' nilify_blanks' Edelstein.Ich weiß, dass das deine Frage nicht beantwortet, aber es ist eher eine Zustimmung. –