Зачем использовать Proc.new для вызова метода в обратном вызове Rails? - PullRequest
13 голосов
/ 02 марта 2011

во всех уроках для RoR я вижу случаи, когда кодер решил использовать Proc.new, когда, по-видимому, это и не нужно, и довольно непривлекательно.

Пример, здесь есть обратный вызов для помещенного в модель, одиниспользуя Proc.new, другой, предположительно, делает то же самое:

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?"Способ?

Заранее спасибо

Ответы [ 2 ]

15 голосов
/ 29 декабря 2011

В приведенном выше примере использование символа для условного метода, вероятно, будет лучшим выбором.

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

Возможно, это устранит необходимость в платной карте? способ.

2 голосов
/ 02 марта 2011

Я бы сказал, что в старых версиях Rails мы так и поступали, и кто-то добавил функцию, с помощью которой вы можете передать строку для оценки в качестве метода экземпляра в текущей модели.

В простых сценариях это делает старый стиль избыточным, но допускает использование Proc для более сложных операторов if, которых невозможно достичь с помощью метода только на текущем экземпляре.

...