2009-07-12 13 views
32

Me gustaría crear un método adicional al 'foo'.titlecase predeterminado que agregará correctamente "posesividad" a él.Hacer una inflexión de rieles para cuerdas posesivas?

La cadena es el nombre de un usuario (< - acaba de hacer un justo ahí!)

Por ejemplo: "sam" es el usuario <% = user.titlecase.possessive + 'Perfil' %> => # Perfil de Sam

Sólo necesita para manejar casos extremos como:

Perfil de Steelers (debe ser Steelers Perfil) Perfil de Ross (Ross debe ser Perfil)

+0

¿Dónde se almacena el nombre del usuario? ¿Quieres decir que es el nombre de la clase? – txwikinger

+1

Parece una solución minimalista aquí: http://gist.github.com/474384 – Benson

Respuesta

31

Necesitaba esto también, así que hice la implementación disponible en github y como una joya en rubygems para que pueda incluirlo en su proyecto bastante fácil.

En los carriles 3 Todo lo que hacemos es

gem "possessive" 

y lo tendrá.

+0

Gracias, esto es perfecto. –

+8

Parece que esta joya (y todos los demás comentarios aquí) lo están haciendo mal. No puede simplemente agregar un apóstrofo a cualquier sustantivo que termine en 's', debe ser singular. "El violín del Sr. Adams es un Guarneri". Es incorrecto. "El violín del Sr. Adams es un Guarneri". es correcto. – bratsche

+10

@bratsche No estoy de acuerdo. "La opinión de Carlos es correcta" –

14

Lo que quieres es bastante trivial, dadas las clases abiertas de ruby.

class String 
    def possessive 
    self + case self[-1,1]#1.8.7 style 
    when 's' then "'" 
    else "'s" 
    end 
    end 
end 


#rspec examples 
describe "String#possessive" do 
    it "should turn Steelers into Steelers'" do 
    "Steelers".possessive.should == "Steelers'" 
    end 
    it "should turn sam into sam's" do 
    "sam".possessive.should == "sam's" 
    end 
end 

Es probable que desee poner esto en un plugin, para mantenerlo separado de su código de lógica de negocio.

$ script/generate plugin Possessiveate 

A continuación, sólo deje caer el código para la init.rb generada en el directorio del plugin. Casi todos los demás archivos generados no son necesarios, pero podría interesarle observar la estructura de archivos predeterminada.

+0

¿Qué pasa con "eso" y "quién"? – Rimian

21

una reescritura de menor importancia del código de BaroqueBobcat, para los amantes Shoulda (y los amantes del operador ternario):

inicializador: especificación

module StringExtensions 
    def possessive 
    self + ('s' == self[-1,1] ? "'" : "'s") 
    end 
end 

class String 
    include StringExtensions 
end 

Shoulda:

require File.expand_path(File.dirname(__FILE__) + "/../test_helper") 

class StringExtensionsTest < ActiveSupport::TestCase 
    context 'String' do 
    context '#possessive' do 
     should "turn sam into sam's" do 
     assert_equal "sam's", "sam".possessive 
     end 
     should "turn Steelers into Steelers'" do 
     assert_equal "Steelers'", "Steelers".possessive 
     end 
    end 
    end 
end 

Editar: ver Rimian de Responda a esta pregunta, que maneja apropiadamente "quién" y "eso".

+0

¿Qué pasa con "eso" y "quién"? – Rimian

10

Realmente no quería usar una gema así que implementé una combinación de algunas respuestas que ya están aquí. Pero luego me despertaron en medio de la noche al darme cuenta de que estos ejemplos son incorrectos. ¿Qué pasa con "quién" y "eso"? (Inglés es difícil!)

module Possessive 
    def possessive 
    suffix = if self.downcase == 'it' 
     "s" 
    elsif self.downcase == 'who' 
     'se' 
    elsif self.end_with?('s') 
     "'" 
    else 
     "'s" 
    end 
    self + suffix 
    end 
end 

class String 
    include Possessive 
end 

Y las especificaciones:

describe Possessive do 
    it "has possessive names not ending in s" do 
    "james".possessive.should == "james'" 
    end 

    it "has possessive names not ending in s" do 
    "James".possessive.should == "James'" 
    end 

    it "has possessive names ending in s" do 
    "sally".possessive.should == "sally" 
    end 

    it "has possessive names ending in s" do 
    "Sally".possessive.should == "Sally's" 
    end 

    it "has possessive its" do 
    "it".possessive.should == "its" 
    end 

    it "has possessive Its" do 
    "It".possessive.should == "Its" 
    end 

    it "has possessive who" do 
    "who".possessive.should == "whose" 
    end 

    it "has possessive Who" do 
    "Who".possessive.should == "Whose" 
    end 
end 

Nota: No es la solución más elegante. Pero, como dijo Albert Einstein, la elegancia es para los sastres.

+0

Esto es excelente, pero ¿dónde mejor agrega el código en una aplicación Rails 3.2? –

2

Si cree que la condición utilizada en todas estas respuestas hasta el momento es incorrecta, puede verificar si la palabra ya está pluralizada.

Así, utilizando la solución de Jamie Flournoy como ejemplo, se puede utilizar en lugar de self == self.pluralize's' == self[-1, 1], y obtener estos resultados:

"Steelers".possessive # Steelers' 
"Ross".possessive # Ross's 
"Chris".possessive # Chris' before inflections.rb change, Chris's after 

"Ross".pluralize ya está "Rosses", como se podría esperar. Pero no es "Chris".pluralize, por lo que tendría que agregar inflection.irregular "Chris", "Chrises" a inflections.rb para que el formulario posesivo se muestre correctamente. Y supongo que debe agregar continuamente irregularidades para otras palabras/nombres poco comunes para terminar teniendo las formas posesivas correctas.

De nuevo, esto es si, bajo la otra creencia, no es suficiente verificar si la última letra de una cadena es s.

Cuestiones relacionadas