2011-03-01 3 views
12

RoR의 모든 자습서에서 코더가 Proc.new를 사용하기로 선택한 경우는 겉으로보기에는 불필요하고 다소 매력적이지 않은 경우가 있습니다.Proc.new를 사용하여 Rails 콜백에서 메소드를 호출하는 이유는 무엇입니까?

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.new 사용하여 모델에 배치를 위해

예, 여기 콜백은? 왜 Proc를 사용합니까? 그들은 둘 다 "paid_with_card"라고 부르지 않습니까? 방법? 사전에

감사

답변

15

위의 예에서 조건부 방법에 대한 기호를 사용하는 것이 가장 좋은 선택 일 수 있습니다.

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

문자열 옵션은 문자열의 Ruby 코드를 평가하기 위해 eval을 사용합니다. 그래서 개인적으로, 짧은 인라인 조건을 작성하는 경우 메소드 나 Proc를 호출하는 경우 심볼을 사용하는 것을 선호합니다. RailsGuides documentation

:

발동 객체를 사용하여 당신에게 별도의 방법 대신 인라인 상태를 기록 할 수있는 기능을 제공합니다. 이 옵션은 단 하나의 라이너에 가장 적합합니다.

더 나은이 방법으로 설명 할 수있는 PROC를 사용하여 생각 :

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

이 가능하게 paid_with_card에 대한 필요성을 제거하는 것입니까? 방법.

+0

예를 들어, paid_with_card와 같은 메소드를 사용하여 레일 모델을 흩 뜨리지 않는 것이 더 좋을 수도 있습니다. – sunkencity

+0

필자는 다음과 같이 생각합니다. 자동으로 포함되고 다른 컨텍스트에서 재사용되는 구성 옵션이 많다는 것을 의미합니다. 기본 처리 방법 : if => string, proc, etc와 같은 옵션을 설정하는 방법이 있습니다. – sunkencity

2

나는 레일의 이전 버전에서 그것이 우리가 일을하는 데 사용, 누군가가 당신이 문자열을 전달할 수있다 기능을 추가하는 방법은 인스턴스로 평가되어야하는 사건이었다라고 말하고 싶지만 메서드를 호출합니다.

단순한 시나리오에서는 이전 스타일이 중복되지만 현재 인스턴스에서만 메서드를 사용하여 구현할 수없는보다 복잡한 'if'문에 대해 Proc를 사용할 수 있습니다.

관련 문제