为占有字符串制作铁轨变形?

cho*_*ovy 34 ruby-on-rails

我想创建一个除了默认的'foo'.titlecase之外的方法,它将正确地添加"占有性".

字符串是用户的名字(< - 只是在那里做了一个!)

例如:"sam"是用户<%= user.titlecase.possessive +'个人资料'%> => #Sam的个人资料

它只需要处理边缘情况,如:

钢人队的简介(应该是钢人队的简介)罗斯的简介(应该是罗斯的简介)

Cod*_*dad 31

我也需要这个,因此我在github上提供了实现,并在rubygems 上作为gem,所以你可以很容易地将它包含在你的项目中.

在rails 3中你所做的就是

gem "possessive" 
Run Code Online (Sandbox Code Playgroud)

你会拥有它.

  • @bratsche我不同意."卡洛斯的观点是正确的" (12认同)
  • 从技术上讲,@ bratsche是正确的.包含's'仅取决于单词是单数还是复数,而不是它是否以's'结尾.请参阅此处:http://grammar.ccc.commnet.edu/grammar/possessives.htm Carlos的观点并未反映出正确的英语. (9认同)
  • 它看起来像这个宝石(以及这里的所有其他评论)做错了.你不能只将撇号添加到任何以's'结尾的名词,它需要是单数."亚当斯先生的小提琴是Guarneri." 是不正确的."亚当斯先生的小提琴是Guarneri." 是正确的. (8认同)
  • 引用http://grammar.ccc.commnet.edu/grammar/possessives.htm:"一致性是关键:如果你选择不在已经以s结尾的名词后添加-s,那么在整个文本中一致地这样做".没有任何地方可以说从一个单一的占有欲结尾省略-s是一个破坏规则 - 只是一个推荐.如上所述,关键是一致性.所以,你们都是正确的,如果你遵循gem的规则(省略了S),它就可以了. (6认同)

Jam*_*noy 21

对于Musta爱好者(以及三元运算符的爱好者),对BaroqueBobcat的代码进行了一次轻微的重写:

初始化:

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

class String
  include StringExtensions
end
Run Code Online (Sandbox Code Playgroud)

应该规范:

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
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅Rimian对此问题的回答,该问题正确处理"who"和"it".


Bar*_*cat 14

考虑到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
Run Code Online (Sandbox Code Playgroud)

您可能希望将其放在插件中,以使其与业务逻辑代码分开.

$ script/generate plugin Possessiveate
Run Code Online (Sandbox Code Playgroud)

然后将代码放到插件目录中生成的init.rb中.几乎所有其他生成的文件都不需要,但您可能有兴趣查看默认文件结构.


Rim*_*ian 14

我真的不想使用Gem,所以已经在这里实现了一些答案的组合.但是当我意识到这些例子不正确时,我在半夜醒来.那个"谁"和"它"怎么样?(英文很难!)

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
Run Code Online (Sandbox Code Playgroud)

和规格:

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
Run Code Online (Sandbox Code Playgroud)

注意:这不是最优雅的解决方案.但正如阿尔伯特爱因斯坦所说,优雅适合裁缝.