1

すべてのヘルパーについて、Rails アプリケーション全体で、次の構文を置き換えたいと思います。

time_ago_in_words(@from_time)

これとともに:

@from_time.time_ago_in_words

理想的には、この変更により、アプリケーションのどこでもヘルパーを使用できるようになります (同じように5.times)。

これを行うプラグインを知っている人はいますか?自分で巻くのは難しいでしょうか?

4

4 に答える 4

4

新しいモデルを作成する場合、既存のクラスからメソッドを継承させることができます。

例 (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 を発する

于 2009-05-12T03:52:13.037 に答える
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::Base のインスタンスをキャッシュすることをお勧めします。または、それほど重くしたくない場合は、独自のクラスを作成して、必要なヘルパーだけを含めることができます (時間、日付、文字列などの各クラスに直接ヘルパーを含めたくありませんが、 、それはメソッドの名前空間をかなり激しく混乱させます-そしてあなたが望む自然な名前と衝突します)。

于 2009-05-12T14:57:07.183 に答える
1

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

リファインメントの詳細については、こちらをご覧ください。

于 2014-05-19T13:11:44.727 に答える
0

モデル、TimeAgo などを作成します。このアイデアに従って実装してください: 数値を「単語化」するためのコード スニペット

次に、コントローラーで、このクラスを使用してインスタンス変数を作成します。次に、あなたの見解では、@from_time.in_words

于 2009-05-12T02:56:52.723 に答える