2009-07-12 3 views
32

"所有権"を正しく追加するデフォルトの 'foo'というタイトルケースに追加してメソッドを作成したいと思います。所有権のある文字列のためにレールの屈折を作りますか?

文字列は、ユーザーの名前(< - ちょうどそこに1をやった!)です。例えば

: "SAM" は、ユーザである <% = user.titlecase.possessive + 'プロフィール' %> => #サムさんのプロフィール

それだけのようなエッジケースを処理する必要がある:

スティーラーズのプロフィール(スティーラーズでなければなりませんプロフィール) ロスのプロフィール(ロスでなければなりませんプロフィール)

+0

ユーザー名はどこに保存されていますか?クラス名なのですか? – txwikinger

+1

ここではミニマルな解決策のようです:http://gist.github.com/474384 – Benson

答えて

31

これも必要なので、githubで実装を利用できるようにしました。そして、それをあなたのプロジェクトにかなり簡単に含めることができるように、rubygemsの宝石として。レール3あなたがすべてで

gem "possessive" 

であり、あなたがそれを持っています。

+0

ありがとう、これは完璧です。 –

+8

この宝石(そしてここの他のすべてのコメント)が間違っているようです。 「s」で終わる名詞にアポストロフィを追加するだけでは、単数形である必要があります。 "アダムスのヴァイオリンはグアルネリです。"間違っています。 "アダムスのヴァイオリンはグアルネリです。"正しい。 – bratsche

+10

@bratsche私は同意しない。 "カルロスの意見は正しい" –

14

あなたが望むものは、ルビーのオープンクラスを与えられて、とても簡単です。

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 

ビジネスロジックコードとは別に、このプラグインをプラグインに入れておくとよいでしょう。

$ script/generate plugin Possessiveate 

次に、コードをプラグインのディレクトリに生成されたinit.rbにドロップします。他のすべての生成されたファイルはほとんど必要ありませんが、デフォルトのファイル構造を調べることに興味があるかもしれません。 Shoulda愛好家のための

+0

"それ"と "誰"はどうですか? – Rimian

21

BaroqueBobcatのコードのマイナー書き換え、(三項演算子のと愛好家):

イニシャライザ:

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 

編集:参照がRimianさん"who"と "it"を適切に扱うこの質問に答えてください。

+0

「それ」と「誰」はどうですか? – Rimian

10

私は実際に宝石を使いたいとは思わなかったので、既にここでいくつかの回答を組み合わせて実装しました。しかし、夜の真夜中に、これらの例が間違っていることがわかったので、私は目を覚ましました。 "誰"と "それ"はどうですか? (英語は難しいです!)

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 

そしてスペック:

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 

注:これは、最もエレガントな解決策ではありません。しかし、アルバート・アインシュタインが言ったように、優雅さは仕立て屋のためです。

+0

これは優れていますが、Rails 3.2アプリでどこにコードを追加するのが最適ですか? –

2

これらの回答すべてで使用されている条件が間違っていると思われる場合は、その単語が既に複数化されているかどうかを確認することができます。だから、例として、ジェイミーFlournoyのソリューションを使用して

、あなたの代わりに's' == self[-1, 1]self == self.pluralizeを使用し、これらの結果を得ることができます。

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

"Ross".pluralizeを、それが予想されるとして、すでに「Rosses」です。しかし、"Chris".pluralizeはそうではないので、所有者のフォームが正しく表示されるように、inflection.irregular "Chris", "Chrises"をinflections.rbに追加する必要があります。そして、あなたは、他の一般的でない言葉/名前の不正を絶え間なく追加して、適切な所有形態を持つようにしなければならないかもしれないと思います。

文字列の最後の文字がsかどうかを確認するには不十分だと考えている場合も同じです。

関連する問題