2010-03-15 11 views
45

Sto scrivendo un codice Ruby, non Rails, e ho bisogno di gestire qualcosa di simile:Esiste una funzione pluralize in Ruby NOT Rails?

found 1 match 
found 2 matches 

ho Rails installato quindi forse potrei essere in grado di aggiungere una clausola require nella parte superiore dello script, ma qualcuno sa di un metodo RUBY che pluralizza le stringhe? C'è una classe che posso richiedere che possa occuparsi di questo se lo script non è Rails ma ho Rails installato?

Modifica: Tutte queste risposte erano vicine ma ho controllato quella che ha funzionato per me. provare questo metodo come un aiuto quando si scrive Ruby, non Rails, il codice:

def pluralize(number, text) 
    return text.pluralize if number != 1 
    text 
end 
+0

La modifica non è corretta. Non c'è nessuna funzione di ruby. String # pluralize, mancate richiede 'active_support/inflector' o qualcos'altro. – gorn

+0

Well Rails è in continua evoluzione. Sentiti libero di modificare la mia domanda in modo che sia corretta. Al momento non sto lavorando con i binari quindi non ho il tempo di provarlo e vedere quale è il modo corretto per farlo ora. – DJTripleThreat

risposta

64

In realtà tutto quello che dovete fare è

require 'active_support/inflector' 

e che estenderà il tipo di stringa.

si può poi fare

"MyString".pluralize 

che restituirà

"MyStrings" 

per 2.3.5 prova:

require 'rubygems' 
require 'active_support/inflector' 

dovrebbe farlo, se non cercare

sudo gem install activesupport 

e quindi richiede.

+0

che l'ha fatto! Grazie!! – DJTripleThreat

+0

per 2.3.5 sudo gem install ActiveSupport richiedono 'rubygems' require 'active_support/inflettore' dovrebbe Get It sto utilizzando guide bordo (3) C'è stato un sacco di disaccoppiamento, e sembra bundle with it default – scaney

+0

Questo è il nucleo della pluralizzazione di ActiveView, tuttavia ActiveView # pluralize sa anche quando deve usare la versione plurale o singolare, basata sul primo parametro. –

1
require 'active_support' 
require 'active_support/inflector' 

inf = ActiveSupport::Inflector::Inflections.new 

per ottenere l'inflettore, non so come lo si utilizza

53

L'inflazione è eccessiva per la maggior parte delle situazioni.

def x(n, singular, plural=nil) 
    if n == 1 
     "1 #{singular}" 
    elsif plural 
     "#{n} #{plural}" 
    else 
     "#{n} #{singular}s" 
    end 
end 

mettere questo in common.rb, o dove volete le funzioni di utilità generale e ...

require "common" 

puts x(0, 'result') # 0 results 
puts x(1, 'result') # 1 result 
puts x(2, 'result') # 2 results 

puts x(0, 'match', 'matches') # 0 matches 
puts x(1, 'match', 'matches') # 1 match 
puts x(2, 'match', 'matches') # 2 matches 
+0

Questa è una soluzione davvero eccezionale. Semplice e davvero tutto ciò di cui hai bisogno. –

+0

Questo fa perfettamente il lavoro, ottima soluzione. – Benoit

0

ho definito una funzione di supporto per questo, lo uso per ogni utente modificabile vista indice del modello:

def ovyka_counter(array, name=nil, plural=nil) 
    name ||= array.first.class.human_name.downcase 
    pluralize(array.count, name, plural) 
    end 

allora si può chiamare dal punto di vista:

<% ovyka_counter @posts %> 

per l'internazionalizzazione (i18n), si può quindi aggiungere questo ai file YAML di locale:

activerecord: 
    models: 
     post: "Conversation" 
10

Personalmente, come il linguistics gem che non è sicuramente binari correlati.

# from it's frontpage 
require 'linguistics' 

Linguistics.use :en 

"box".en.plural #=> "boxes" 
"mouse".en.plural #=> "mice" 
# etc 
+6

Ho letto "box" .en' e ho pensato "boxen"! –

0

la mia soluzione:

# Custom pluralize - will return text without the number as the default pluralize. 
def cpluralize(number, text) 
    return text.pluralize if number != 1 
    return text.singularize if number == 1 
end 

così si può avere 'recensione' restituito se si chiama cpluralize (1, 'recensioni')

Speranza che aiuta.

2

questo funziona per me (utilizzando ruby ​​2.1.1 e 3.2.17 actionpack):

~$ irb 
>> require 'action_view' 
=> true 
>> include ActionView::Helpers::TextHelper 
=> Object 
>> pluralize(1, 'cat') 
=> "1 cat" 
>> pluralize(2, 'cat') 
=> "2 cats"