私が観察したことから話していますが、必ずしもRailsの慣習とは限りません。
rails g post title content:text
たとえば、default: ''
タイトル(文字列)とコンテンツ(テキスト)の両方がないことを覚えているかもしれません。これは、これに関してRailsの慣習がないこと、または具体的に言えば、デフォルトですべての属性がNULLまたはnilになることが許可されていることのヒントです。
NULL を使用する利点は、これらの属性が設定されているレコードを識別できることです。
API サーバーがあるとします。クライアントが API サーバーへの投稿を作成すると、どの属性が値を持つことを意図しているかがわかります。次のようなことを言ってみましょう。
client-1 の POST パラメータ:
post: {title: 'Foo bar'}
- NULL が許可されている場合、
Post(title: 'Foo bar', content: nil)
- デフォルト: '' の場合、
Post(title: 'Foo bar', content: '')
client-2 の POST パラメータ:
post: {title: 'Foo bar', content: ''}
- NULL が許可されている場合、
Post(title: 'Foo bar', content: '')
- デフォルト: '' の場合、
Post(title: 'Foo bar', content: '')
上記から、default: '' がある場合、クライアントが実際に空のcontent
値を持つことを意図しているかどうかを知ることができないことに注意してくださいcontent
。 (空)とにかく。ただし、NULL を許可する属性がある場合でもcontent
、パラメータで属性を渡さないことで、クライアントが値を持たないことを意図しているかどうかを識別できます。これは重要な使用例です。
プロジェクトと属性の目的に応じて、NULL 許可を使用するか、その属性にデフォルトの空の文字列を設定することができます。
ここで、遭遇した NULL-allowed の主な問題の 1 つは、すべての値が であることを保証できないことですString
。したがって、is NULL または nil<%= @user.profile.location.upcase %>
の場合にエラーが発生します。location
これは、例のような一連のメソッドがある場合は特に、少し面倒になる可能性があります
<%= @user.profile.location.upcase.downcase %>
エラーが発生しないことを適切に確認する必要があるため、これは nil の場合に問題になり@user.profile.location
ます。また、これが nil の場合も問題になります@user.profile
(nil を許可しているとだけ言っておきましょう@user.profile
)。通常、これを機能させるには、次のようなことを行います。
<% if !@user.profile.nil? && !@user.profile.location.nil? %>
<%= @user.profile.location.upcase.downcase %>
<% end %>
エラーが発生しないことを適切に保証するためにチェーンされたメソッドが長いため、このif
状態は非常に長く続く可能性があります。
を使用.try()
すると、これが「クリーン」になる可能性があります。特にテンプレートファイルでこれを何度も使用します。知らない人にとっては混乱を招く可能性がありますが、解決策は以下のようにきれいになります。
<%= @user.profile.try(:location).try(:upcase).try(:downcase) %>
or のいずれ.location
か.upcase
が nil の場合、nil を返し、それ以上レイズしませundefined method ... for NilClass
ん。