2009-05-12 2 views
1

이와어떻게 할 수 레일 헬퍼 더 객체 지향 내가 모든 헬퍼를 들어, 내 전체 Rails 애플리케이션을 통해,이 구문을 교체하고 싶습니다

time_ago_in_words(@from_time) 

:

@from_time.time_ago_in_words 

을 이상적으로이 변경은 도우미가 내 응용 프로그램의 어느 곳에서나 사용할 수 있도록합니다 (동일한 방식으로 말하면, 5.times).

누구든지이 작업을 수행하는 플러그인을 알고 있습니까? 내 자신을 굴리기가 어려울까요?

+0

왜 이것이 중요한가요? 아마도 일부 컨텍스트가 도움이 될 것입니다 ... – runako

+0

난 그냥 기존의 구문 성가신하고 못생긴 찾으십시오. 내 모델에서 @ post.truncate와 같은 것을 호출하는 것도 좋습니다 (예 : 캐싱) –

답변

4

으로 전화하십시오. 새 모델을 만들면 기존 클래스의 메서드를 상속 할 수 있습니다.

예 (APP/모델/mykindofstring.rb) 상기 제어기에서 차례로

class Mykindofstring < String 

    def all_caps_and_reverse 
     self.upcase.reverse 
    end 

end 

:

<%= @my_string %> 

표시 : 뷰에서 호출

@my_string = Mykindofstring.new('This is my string') 

최종적 as This is my string, while :

은 GNIRTS YM SI SIHT로 표시됩니다.

클래스는 문자열 클래스에서 상속되므로 문자열에 적용되는 모든 메서드도 mykindofstring 객체에 적용됩니다. 이 메서드는 두 개의 기존 문자열 메서드를 조합 한 새로운 이름이지만 시간을 형식화 된 문자열로 변환하는 메서드와 같이 원하는대로 만들 수 있습니다.

기본적으로 함수/도우미를 사용하는 대신 사용자 고유의 메서드로 현재 Ruby 클래스를 확장하고 있습니다.

주요 편집 IANS의이 답변에 대한 의견과 위의 질문에 대한 자신의 답변에 따라

, 나는 레일에 약간의 주위에 연주하고 application_helper.rb이 추가 내놓았다 :

지금 바로 응용 프로그램에서 모든 문자열에 메소드를 호출

module ApplicationHelper 
    String.class_eval do 
    def all_caps_and_reverse 
     self.upcase.reverse 
    end 
    end 
end 
:

@string = 'This is a string.' 
@string.all_caps_and_reverse 

이시의 sihT을 .gnirts

+0

하지만 Ruby입니다! 서브 클래 싱이 "적절한"객체 지향이지만 다른 유형의 새 객체를 만들고 싶지 않으면 실제 God-given 문자열을 사용하려면 String 클래스를 열고 메서드를 추가하십시오. class String; def all_caps_and_reverse; self.upcase.reverse; 종료; 끝 –

+0

고마워, 좋은 지적이야. 그에 따라 대답을 수정했습니다. Btw, 이것이 내가 Stack Overflow를 좋아하는 이유입니다. 나는 며칠 만에 여기에 있었고 나의 코드는 이미 개선되고있다. – Jarrod

+0

문자열 클래스를 다시 선언하는 대신 class_eval을 사용하는 이유는 무엇입니까? –

0

모델, TimeAgo 또는 유사한 것을 만드십시오. 이 아이디어를 다음과 같이 구현하십시오. a code snippet for "wordifying" numbers

그런 다음 컨트롤러에서이 클래스를 사용하여 인스턴스 변수를 만듭니다. 그런 다음보기에서 @from_time.in_words

1

모든 (또는 대부분의) 도우미에 대해 전체 응용 프로그램에서이 작업을 수행하는 쉬운 방법은 없습니다.

도우미는 뷰 렌더링 클래스에 포함될 모듈로 구성됩니다.이들을 활용하려면 ActionView 사본을 보관해야합니다 (거대한 거래는 아님).

당신은 항상하지만, 클래스를 열고 원하는 각 도우미를 지정할 수 있습니다 : 당신이 접근을하는 경우

class Time 
    def time_ago_in_words 
    ActionView::Base.new.time_ago_in_words self 
    end 
end 

>> t = Time.now 
=> Tue May 12 10:54:07 -0400 2009 
>> t.time_ago_in_words 
=> "less than a minute" 
(wait a minute) 
>> t.time_ago_in_words 
=> "1 minute" 

, 나는 ActionView의 인스턴스 :: 자료 사용 캐싱 좋습니다. 또는 헤비급으로 가고 싶지 않다면 자신 만의 클래스를 만들어 원하는 헬퍼를 포함시킬 수 있습니다 (헬퍼를 각 시간, 날짜, 문자열 등의 클래스에 직접 포함하고 싶지는 않습니다. 그 때문에 메서드 namespace가 매우 치열 해지고 원하는 자연스러운 이름과 충돌하게됩니다.

1

Ruby 2.1을 사용하는 경우 상세 검색을 사용할 수 있습니다. 원숭이 패치 Ruby 클래스에 대한 대안입니다. @Jarrod's monkey-patch 예를 빌려 :

module MyString 
    refine String do 
    def all_caps_and_reverse 
     upcase.reverse 
    end 
    end 
end 

당신은 지금 당신이 원하는 모든 개체에서 이것을 사용할 수 있습니다 : 당신은 여기 read more about Refinements

class Post 
    using MyString 
end 
@post.title.all_caps_and_reverse 

합니다.