13

RoR のすべてのチュートリアルで、コード作成者が Proc.new を使用することを選択した例を目にしますが、それは不要で魅力的ではないように思われます。

例として、モデルに配置されたコールバックを次に示します。1 つは Proc.new を使用し、もう 1 つはおそらく同じことを行っています。

class Order < ActiveRecord::Base  
  before_save :normalize_card_number,  
    :if => Proc.new { |order| order.paid_with_card? }  
end

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => "paid_with_card?"
end

違いは何ですか?Proc を使用する理由 両方とも「paid_with_card」と呼んでいませんか?方法?

前もって感謝します

4

2 に答える 2

16

上記の例では、条件付きメソッドにシンボルを使用するのがおそらく最良の選択です。

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => :paid_with_card?
end

string オプションは eval を使用して文字列内の Ruby コードを評価します。個人的には、メソッドを呼び出す場合はシンボルを使用し、短いインライン条件を記述する場合は Proc を使用することを好みます。

RailsGuidesのドキュメントによると:

Proc オブジェクトを使用すると、個別のメソッドの代わりにインライン条件を記述できます。このオプションは、ワンライナーに最適です。

Proc を使用すると、次のように説明したほうがよいと思います。

class Order < ActiveRecord::Base
  before_save :normalize_card_number,
    :if => Proc.new { |order| order.payment_type == "card" }
end

これにより、payed_with_card が不要になる可能性があります。方法。

于 2011-12-28T20:37:29.777 に答える
2

古いバージョンの Rails ではそうしていましたが、誰かが現在のモデルのインスタンス メソッドとして評価される文字列を渡す機能を追加したのです。

単純なシナリオでは、古いスタイルは冗長になりますが、現在のインスタンスのみでメソッドを使用して達成することは不可能な、より複雑な 'if' ステートメントに Proc を使用できます。

于 2011-03-01T22:57:10.207 に答える