Подтвердить что ты не робот

Зачем использовать 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? Разве обе они не называют "платной_витой"? метод?

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

4b9b3361

Ответ 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, которые невозможно было бы достичь с помощью метода только для текущего экземпляра.