2

私は過去 6 か月間 Rails を学んでいます。私はそれが素晴らしいと思います!

しかし、私のアプリが受け取るエラーの 99% は nil エラーです。nil のフィールドを表示しようとしているか、外部キーが削除されたレコードを指しています。

私は多くの場所でこのタイプのコードを持っています:

        <% if location.parent != nil %>
          <td><%= location.parent.name %></td>
        <% else %>
          <td></td>
        <% end %>

      <% if location.client_id != nil %>
        <td><%= location.client.client_name %></td>
      <% else %>
        <td></td>
      <% end %>

フィールドが nil の場合、Rails が空白を表示することを本当に望みます! または、エラーのあるフラッシュを設定してもページが表示されます。代わりに、ページが爆発します。Heroku では、「申し訳ありませんが、何か問題があります....」というメッセージが表示されます。

空白のフィールドをより適切に処理する方法はありますか? 上記をコーディングするより良い方法はありますか?私が知らない Rails 設定はありますか? これらのタイプのエラーを処理する宝石はありますか?

4

2 に答える 2

3

実際には、いくつかの外部キー制約after_destroyメソッドをアソシエーションに配置する必要があります。これにより、データベースが不整合な状態になるのを防ぎます。

ただし、そのリファクタリングとは別に、ActiveSupportとそれがrubyに加えるさまざまな追加機能を確認する必要があります。http://guides.rubyonrails.org/active_support_core_extensions.htmlを参照してください。

私があなたに役立つと思うどんなオブジェクトでも利用できる3つの方法があります:

  • blank?-オブジェクトがnil、empty?、false、およびその他の条件の場合、trueを返します。より良い説明については、ドキュメントを参照してください。
  • present?-オブジェクトがnilでも空でもない場合、trueを返しますか?または本当。より良い説明については、ドキュメントを参照してください。
  • try(:foo)-オブジェクトのメソッドを呼び出そうとしますfoo。オブジェクトがnilの場合はnilを返します。より良い説明については、ドキュメントを参照してください。

これを使用すると、サンプルコードは次のようになります。

<td><%= location.parent.try(:name) %></td>
<td><%= location.parent.try(:client_name) %></td>

オブジェクトがnilでないことを期待している理由を確認することを強くお勧めします。移行における外部キーの制約と、関連付けのafter_destroyフックは、これに役立ちます。

于 2013-02-18T03:43:16.963 に答える
0

Rails の修正ではありませんが、オブジェクト指向設計の NullObject パターンを使用してコードをリファクタリングし、"nil" を別の方法で処理することができます。このパターンは基本的に、オブジェクトが nil のときに処理する null/nil クラスを作成することを意味します。いくつかの欠点があります: 維持する余分なクラスと、nil の可能性がある新しいメソッドを追加するときに null クラスを編集することを忘れないでください。良い点は、条件がビューの外に移動することです。

この件に関する良いブログ投稿は次のとおりです

別の提案は、条件をビューの外に移動してヘルパーに移動することです。ヘルパーは、ビュー ロジックを含む単純なモジュールです。ビューにすべてのロジックが含まれているビューに苦しんでおり、ビューのコードがすぐに混乱してしまいます。

于 2013-02-18T03:21:36.087 に答える