Pergunta

Eu gostaria de, para todos os ajudantes, em toda a minha toda aplicação Rails, substitua a seguinte sintaxe:

time_ago_in_words(@from_time)

com este:

@from_time.time_ago_in_words

Idealmente esta mudança também faria os ajudantes disponíveis em qualquer lugar na minha aplicação (da mesma maneira, digamos, 5.times é).

Alguém sabe de um plugin que faz isso? Seria difícil fazer a minha própria?

Foi útil?

Solução

Se você criar um novo modelo você pode fazer isso herdam os métodos de uma classe existente.

Exemplo (app / modelos / mykindofstring.rb):

class Mykindofstring < String

    def all_caps_and_reverse
        self.upcase.reverse
    end 

end

Em seguida, a partir do controlador:

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

e, finalmente, chamando-o a partir da vista:

<%= @my_string %>

é exibido como Esta é a minha corda, enquanto:

<%= @my_string.all_caps_and_reverse %>

é exibido como GNIRTS YM SI SIHT.

Os herda classe da classe string, então todos os métodos que se aplicam a uma corda também se aplicam a um objeto mykindofstring. O método em que é apenas um novo nome para uma combinação dos dois métodos cadeia existente, mas você pode torná-lo fazer o que quiser, como um método para converter uma hora em uma string formatada.

Basicamente é só estender uma classe de Ruby atual com seus próprios métodos em vez de utilizar funções / ajudantes.

Principais Editar

Com base Ians comentário a esta resposta e sua própria resposta para a pergunta acima, eu brinquei um pouco em Rails e veio com a adição deste ao application_helper.rb:

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

Agora é só chamar o método em qualquer cadeia na app:

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

.gnirts a si sihT

Outras dicas

Você não vai encontrar nenhuma maneira fácil de fazer isso em toda sua aplicação para todos (ou mesmo mais) ajudantes.

Os ajudantes são estruturados como módulos destinados a ser incluídos nas aulas de vista de renderização. Para aproveitá-los, você tem que manter uma cópia de um ActionView redor (não é um grande negócio suponho).

Você sempre pode abrir as classes e especificar cada helper que você quer, no entanto:

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"

Se você tomar essa abordagem, eu recomendo cache a instância de ActionView :: Base que você usa. Ou, se você não quer ir tão pesado, você pode criar sua própria classe para incluir apenas os ajudantes que você quer (você não quer incluir os ajudantes diretamente em cada hora, data, String, etc, classe, embora , como que vai atravancar o método namespace muito feroz -. e conflito com os nomes naturais que você quer)

Se você estiver usando o Ruby 2.1 você pode usar refinamentos. Eles são uma alternativa para as classes de Ruby-remendar macaco. Para emprestar @ exemplo macaco-patch de Jarrod:

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

Agora você pode usar isso em qualquer objeto que você deseja:

class Post
  using MyString
end
@post.title.all_caps_and_reverse

Você pode ler mais sobre refinamentos aqui.

Faça um modelo, TimeAgo ou algo similar. Implementar seguir essa ideia aqui: um trecho de código para os números "wordifying"

Então, em seu controlador, criar as variáveis ??de instância usando esta classe. Então, na sua opinião, chamada @from_time.in_words

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top