약간 이해하기 어려움 alias_method
/alias_method_chain
입니다. 나는 다음과 같은 코드가 있습니다 :alias_method, alias_method_chain 및 self.included
module ActionView::Helpers
module FormHelper
alias_method :form_for_without_cherries, :form_for
def form_for(record, options = {}, &proc)
output = 'with a cherry on top'.html_safe
output.safe_concat form_for_without_cherries(record, options = {}, &proc)
end
end
end
이 정확히 무엇을 내가 그것을 원하는 - 어떤 form_for
전화의 상단에 "위에 체리와 함께"추가합니다.
그러나 이것은 몇 가지 이유로 좋지 않은 코드입니다. 첫째, form_for(?)
의 다른 우선 적용에서 연결되지 않으므로 두 번째 form_for
메서드를 작성하면 "그리고 또 다른 맨 위에있는 체리"를 추가하는 방법은 표시되지 않습니다. 둘째, alias_method
과 alias_method_chain
은 구식 솔루션으로, 대신 모듈에 self.included
&을 사용해야합니다.
하지만 self.included
은 form_for
메서드를 호출 할 수 없습니다. 부모 메서드를 계속 호출합니다. 여기에 내가 뭘하려고하는지 :
module CherryForm
def self.included(base)
base.extend(self)
end
def form_for(record, options = {}, &proc)
output = 'with a cherry on top'.html_safe
output.safe_concat super(record, options = {}, &proc)
end
end
ActionView::Helpers::FormHelper.send(:include, CherryForm)
위의 솔루션은 작동하지만, 나는 그 일을하는 잘못된 방법이라고 생각합니다. 어떤 루비 참전 용사가 나에게 더 우아한 방법을 보여줄 수 있다면 - 그리고/또는 왜 두 번째 해결책이 호출되지 않는지 - 나는 감사 할 만하다.
두 번째 접근 방식이 작동하지 않는 이유는 다음을 참조하십시오. http://stackoverflow.com/questions/5944278/overriding-method-by-another-defined-in-module – tsherif
많은 도움이되었습니다. 많은 감사합니다 – PlankTon