2

Web アプリケーションが失敗する最も一般的な理由の 1 つは、ビューが期待する特定の属性がユーザーにない場合があるためです。たとえば、私のアプリケーションのほとんどのユーザーは、システムに学歴 (学校、学位など) のエントリを持っていますが、一部のユーザーは持っていません。私の見解は次のようになると仮定します。

<% @educations.each do |education| %>
  <%= education.school %>
  <%= education.degree %>
<% end %>

「ポケモン」の例外処理を避けたいのですが、ユーザーがデータベースに教育エントリを持っていない場合に発生する「nil:NilClass の未定義メソッド「学位」」エラーを処理するためのより良い方法が必要であると感じています。 . これは醜い/退屈な修正のように思えます:

<% @educations.each do |education| %>
  <% if education.school %>
    <%= education.school %>
  <% end %>
  <% if education.degree %>
   <%= education.degree %>
  <% end %>
<% end %>

どんな入力でも大歓迎です。ありがとうございました!

4

2 に答える 2

1

作業している最初のオブジェクトが nil にならないことがわかっている限り、最も簡単な方法は次のようにすることです。

- @educations.each do |education|
  = education.try :school
  = education.try :degree

#tryメソッドはとても便利です.to_sまた、nil である可能性があると思われるものを呼び出すこともできます。

- @educations.each do |education|
  = education.school.to_s
  = education.degree.to_s

これにより、nil が空の文字列に変換されます。これはビュー IMO ではあまり役に立ちませんが、文字列であると想定されていて空である可能性がある入力がある場合に、多くの場合に役立ちます。つまり、次のような方法です。

def put_in_parenthesis(string)
  "(" + string.to_s + ")"
end
于 2012-11-06T22:47:03.203 に答える
0

ここにはいくつかのオプションがあります。

最も簡単に実装できるのは、try メソッドです。次のように使用されます。

<%= education.try( :degree ) %>

問題は、それが少しアンチパターンtry()と見なされていることです。リファレンスが示すように、次のようなもので同様の機能を実現できます。

<%= education && education.degree %>

私の意見では、これは知的にはそれほど違いはありません。これをもう少しきれいに処理する一般的な方法はNull オブジェクト パターンです。これは基本的に定義されたニュートラル ("null") 動作を持つオブジェクトです。

于 2012-11-06T22:52:09.183 に答える