Зачем использовать Proc.new для вызова метода в обратном вызове Rails?
во всех учебных пособиях для 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? Разве обе они не называют "платной_витой"? метод?
Заранее спасибо
Ответы
Ответ 1
В приведенном выше примере использование символа условного метода, вероятно, будет лучшим выбором.
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
Я бы сказал, что в старых версиях Rails это то, что мы делали, и кто-то добавил функцию, благодаря которой вы могли передать строку, которая будет оцениваться как метод экземпляра для текущей модели.
В простых сценариях это делает старый стиль избыточным, но позволяет использовать Proc для более сложных операторов if, которые невозможно было бы достичь с помощью метода только для текущего экземпляра.