36 Stimmen

Eine Schienenbeugung für besitzanzeigende Zeichenfolgen machen?

Ich möchte eine Methode erstellen, die zusätzlich zur Standardmethode "foo".titlecase korrekt "possessiveness" hinzufügt.

Die Zeichenkette ist der Name eines Benutzers (<- ich habe da gerade einen gemacht! )

Zum Beispiel: "sam" ist der Benutzer <%= user.titlecase.possessive + ' Profil' %> => #Sam's Profil

Es muss nur mit Randfällen wie:

Steelers's Profil ( sollte Steelers' Profil sein) Ross's Profil ( sollte Ross's Profil sein )

0 Stimmen

Wo wird der Name des Benutzers gespeichert? Meinen Sie, es ist der Klassenname?

2 Stimmen

Das sieht nach einer minimalistischen Lösung aus: gist.github.com/474384

31voto

Coderdad Punkte 793

Ich brauchte das auch, und deshalb habe ich die Umsetzung auf github und als Gem auf Rubygems, so dass Sie es ganz einfach in Ihr Projekt einbinden können.

In Schienen 3 müssen Sie nur Folgendes tun

gem "possessive" 

und Sie werden es bekommen.

24voto

Jamie Flournoy Punkte 49554

Eine kleine Neufassung von BaroqueBobcats Code für Shoulda-Liebhaber (und Liebhaber des ternären Operators):

Initialisierung:

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

class String
  include StringExtensions
end

Sollte spezifiziert werden:

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

Edit: siehe Rimians Antwort auf diese Frage, die "wer" und "es" richtig behandelt.

15voto

BaroqueBobcat Punkte 9952

Was Sie wollen ist ziemlich trivial zu tun, da Ruby's offene Klassen.

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

Wahrscheinlich möchten Sie dies in einem Plugin unterbringen, um es von Ihrem Geschäftslogikcode zu trennen.

$ script/generate plugin Possessiveate

Dann fügen Sie den Code einfach in die generierte init.rb im Verzeichnis des Plugins ein. So gut wie alle anderen generierten Dateien werden nicht benötigt, aber es könnte interessant sein, sich die Standard-Dateistruktur anzusehen.

14voto

Rimian Punkte 34365

Ich wollte nicht wirklich einen Edelstein verwenden, also habe ich eine Kombination aus einigen der hier bereits gegebenen Antworten implementiert. Aber dann wurde ich mitten in der Nacht von der Erkenntnis geweckt, dass diese Beispiele falsch sind. Was ist mit "who" und "it"? (Englisch ist schwer!)

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

Und die technischen Daten:

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

Hinweis: Es ist nicht die eleganteste Lösung. Aber wie Albert Einstein sagte, ist Eleganz etwas für Schneider.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X