문제

모든 도우미를 위해 전체 레일 응용 프로그램 에서이 구문을 대체하고 싶습니다.

time_ago_in_words(@from_time)

이것으로 :

@from_time.time_ago_in_words

이상적 으로이 변경 사항은 또한 내 응용 프로그램의 어느 곳에서나 도우미를 사용할 수있게 해줄 것입니다 (예 : 5.times 이다).

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

도움이 되었습니까?

해결책

새 모델을 만들면 기존 클래스에서 메소드를 상속받을 수 있습니다.

예제 (app/models/mykindofstring.rb) :

class Mykindofstring < String

    def all_caps_and_reverse
        self.upcase.reverse
    end 

end

그런 다음 컨트롤러에서 :

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

그리고 마지막으로보기에서 그것을 부릅니다.

<%= @my_string %>

이것은 내 문자열이므로 다음과 같이 표시됩니다.

<%= @my_string.all_caps_and_reverse %>

gnirts ym si siht로 표시됩니다.

클래스는 문자열 클래스에서 상속되므로 문자열에 적용되는 모든 메소드도 MyKindofstring 객체에도 적용됩니다. 그것의 메소드는 두 가지 기존 문자열 메소드의 조합에 대한 새로운 이름 일 뿐이지 만 시간을 형식화 된 문자열로 변환하는 방법과 같이 원하는대로 할 수 있습니다.

기본적으로 기능/도우미를 사용하는 대신 현재 루비 클래스를 자신의 방법으로 확장하는 것입니다.

주요 편집

이 답변에 대한 IAN의 의견과 위의 질문에 대한 자신의 답변을 바탕으로, 나는 레일에서 약간 연주했으며 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

.gnirts a si siht

다른 팁

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

도우미는보기 렌더링 클래스에 포함되는 모듈로 구성됩니다. 그들을 활용하려면 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 :: Base의 인스턴스를 캐싱하는 것이 좋습니다. 또는 헤비급으로 가고 싶지 않다면 자신만의 수업을 만들어 원하는 도우미를 포함시킬 수 있습니다 (매번, 날짜, 문자열 등, 클래스에 도우미를 직접 포함시키고 싶지는 않습니다. ,이 방법은 메소드 네임 스페이스를 매우 치열하게 만들고 원하는 자연 이름과 충돌합니다).

Ruby 2.1을 사용하는 경우 정제를 사용할 수 있습니다. 그들은 Monkey Patching Ruby의 수업에 대한 대안입니다. 빌리다 @jarrod 's Monkey-Patch 예시:

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

이제 원하는 객체에서 이것을 사용할 수 있습니다.

class Post
  using MyString
end
@post.title.all_caps_and_reverse

당신은 할 수 있습니다 개선에 대해 자세히 알아보십시오 여기.

모델, 시미로 또는 비슷한 것을 만드십시오. 이 아이디어에 따라 구현하십시오."Wordifying"숫자에 대한 코드 스 니펫

그런 다음 컨트롤러 에서이 클래스를 사용하여 인스턴스 변수를 만듭니다. 그런 다음, 당신의 견해로는 전화하십시오 @from_time.in_words

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top