2

Rails のデータベースに保存する前に、ユーザーのメール アドレスを小文字に変換したいと考えています。私はこのコードを使用してこのページにいます:

class User < ActiveRecord::Base
  before_save {self.email = email.downcase}
end

と書いても動きますself.email = self.email.downcaseが、 と書いても動きませんemail = email.downcaseself省略できる条件は?

4

2 に答える 2

7

self割り当ての左側でセッター1を使用する場合は、常に指定する必要があります (例: or 2 ) 。self.x = valself.x += val

selfメソッドをシャドウするローカル変数がない場合、ゲッター (通常のメソッド呼び出し) では省略できます。

x = valorの形式の式x += val- つまり、なしself-は常にローカル変数に代入されますx。この場合、ローカル変数に値が代入されemail( と混同しないでくださいself.email)、ブロックが終了したときに破棄されたことを意味します。


1 Ruby の attr_accessor とは?を参照してください。ゲッター/セッターの実装方法について。

2 ruby​​ が見るself.x = yと のように扱うself.__send__(:x=, y)。つまり、セッター (名前の末尾に等号がある通常のメソッド) が魔法のように呼び出されます。

于 2013-11-13T05:37:29.023 に答える
1
email = email.downcase

のクラス合成を上書きする新しい変数emailを作成します。私の経験則では、常に属性の前にself. Ruby ではどちらを行うこともできますが、これはPOLSまたは最小サプライズの原則の一部です。他の開発者と一緒に作業するときは、コードを掘り下げる必要がなく、電子メールが属性であることを知っているだけでよいでしょう。要するに、省略しないselfでください。

そして、神のために、コードを少し空けてください。読みやすさが鍵です。

before_save { self.email.downcase! }
于 2013-11-13T05:39:58.357 に答える