0

これら 2 つのコード クリップの違いは何ですか? 最初のクリップには「This one:」というラベルが付けられ、2 番目のクリップには「And this:」というラベルが付けられます。(.rb)

class Reseller < ActiveRecord::Base
attr_accessible :blah, :blah, :contact_email

これです:

before_save { |reseller| reseller.contact_email = contact_email.downcase }

この:

before_save { contact_email.downcase }

ありがとうございました

4

2 に答える 2

4

最初は、値を永続化されたプロパティに戻します (または、少なくともそうすべきです。再確認します)。

2 番目は、それを小文字に変換するだけで、結果には何もしません。

2 番目の読み取りの場合contact_email.downcase!、実際のプロパティを変更する必要があります。

「bang」メソッドは、Ruby の規則に従って、破壊的なメソッド (たとえば、基になるデータを変更するメソッド) に末尾に . を付けて命名し!ます。

注: tadman が指摘しているように、AR の魔法の一部をバイパスする可能性があるため、AR テストに対してこれを精査して、アプリがまだ期待どおりに機能することを確認する必要があります。

于 2013-08-07T19:43:04.617 に答える
3

最初の例では、連絡先の電子メールを小文字にして保存しますが、それが実際に指定どおりに機能するかどうかは不明です。2 つ目は、破棄されて何も役に立たない一時的な値を作成します。

通常、これらを次のように実装します。

 class Reseller < ActiveRecord::Base
   before_save :downcase_contact_email

 protected
   def downcase_contact_email
     self.contact_email = self.contact_email.downcase if (self.contact_email?)
   end
 end

実際に存在downcaseする場合にのみメソッドを呼び出すように保護を追加しました。ここに検証があるかどうかが明確ではないため、値に対してトリガーされるcontact_emailリスクがあります。before_savenil

スタイルの問題として、通常、このようなクリーンアップ メソッドは、before_validation正しく入力されていることを検証する機会がある場合にトリガーされます。フェーズではbefore_save、問題を検出するには遅すぎます。保存を中止することは、絶対的な最後の手段として行うことです。

于 2013-08-07T19:44:10.867 に答える