すべてのヘルパーについて、Rails アプリケーション全体で、次の構文を置き換えたいと思います。
time_ago_in_words(@from_time)
これとともに:
@from_time.time_ago_in_words
理想的には、この変更により、アプリケーションのどこでもヘルパーを使用できるようになります (同じように5.times
)。
これを行うプラグインを知っている人はいますか?自分で巻くのは難しいでしょうか?
すべてのヘルパーについて、Rails アプリケーション全体で、次の構文を置き換えたいと思います。
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 %>
This is my string として表示されますが、次のように表示されます。
<%= @my_string.all_caps_and_reverse %>
GNIRTS YM SI SIHT として表示されます。
このクラスは文字列クラスから継承されるため、文字列に適用されるすべてのメソッドは mykindofstring オブジェクトにも適用されます。その中のメソッドは、既存の 2 つの文字列メソッドを組み合わせた新しい名前にすぎませんが、時刻を書式設定された文字列に変換するメソッドなど、好きなことを行うことができます。
基本的には、関数/ヘルパーを使用する代わりに、現在の Ruby クラスを独自のメソッドで拡張するだけです。
主な編集
この回答に対する Ians のコメントと、上記の質問に対する彼自身の回答に基づいて、Rails で少し遊んで、これを 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
.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 を使用している場合は、絞り込みを使用できます。これらは、Ruby のクラスにモンキー パッチを適用する代替手段です。@Jarrod のモンキーパッチの例を借りるには:
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
リファインメントの詳細については、こちらをご覧ください。
モデル、TimeAgo などを作成します。このアイデアに従って実装してください: 数値を「単語化」するためのコード スニペット
次に、コントローラーで、このクラスを使用してインスタンス変数を作成します。次に、あなたの見解では、@from_time.in_words