Ruby on rails 对所有格字符串进行rails屈折?
我想在默认的“foo.titlecase”之外创建一个方法,该方法将正确地添加“占有性” 字符串是用户名(#Sam的个人资料 它只需要处理边缘情况,如: 钢人档案(应为钢人档案)Ruby on rails 对所有格字符串进行rails屈折?,ruby-on-rails,Ruby On Rails,我想在默认的“foo.titlecase”之外创建一个方法,该方法将正确地添加“占有性” 字符串是用户名(#Sam的个人资料 它只需要处理边缘情况,如: 钢人档案(应为钢人档案) Ross的个人资料(应该是Ross的个人资料)考虑到ruby的开放类,您想要做的事情非常简单 class String def possessive self + case self[-1,1]#1.8.7 style when 's' then "'" else "'s" end
Ross的个人资料(应该是Ross的个人资料)考虑到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
您可能希望将其放在插件中,以使其与业务逻辑代码分离
$ script/generate plugin Possessiveate
然后将代码放到插件目录中生成的init.rb中。几乎所有其他生成的文件都不需要,但您可能有兴趣查看默认的文件结构。对BaroqueBobcat的代码进行一次小的重写,适合Shoulda爱好者(以及三元运算符爱好者): 初始值设定项:
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
require File.expand\u path(File.dirname(\uuuuu File\uuuu)+“/../test\u helper”)
类StringExtensionTest
编辑:请参阅Rimian对这个问题的回答,它正确地处理了“谁”和“它”。我也需要它,因此我将实现作为rubygems上的一块宝石提供给您,这样您就可以很容易地将其包含在您的项目中 在rails 3中,您所要做的就是
gem "possessive"
你会得到它。
< P>我并不是真的想使用宝石,所以这里已经实现了一些答案的组合。但是后来我意识到这些例子是不正确的,半夜被唤醒了。“WHO”和“它”是什么?(英语很难!) 以及规格: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
注意:这不是最优雅的解决方案。但正如阿尔伯特·爱因斯坦所说,优雅是为裁缝而设。如果你认为目前为止所有这些答案中使用的条件都不正确,你可以检查这个词是否已经是复数 因此,以Jamie Flournoy的解决方案为例,您可以使用
self==self.pluralize
而不是的'==self[-1,1]
,并得到以下结果:
"Steelers".possessive # Steelers'
"Ross".possessive # Ross's
"Chris".possessive # Chris' before inflections.rb change, Chris's after
“Ross”。正如人们所预料的那样,pluralize
已经是“Rosses”。但是“Chris”。pluralize
不是,因此您必须添加屈折。不规则的“Chris”,“chrise”
到deflocations.rb,以便所有格形式正确显示。我想您可能需要不断为其他不常见的单词/名称添加不规则项,以获得正确的所有格形式
同样,如果您认为检查字符串的最后一个字母是否为s是不够的,那么这是另一种观点。用户名存储在哪里?您的意思是它是类名吗?这里看起来是一种最简单的解决方案:它看起来像这个宝石(以及这里的所有其他注释)你做错了。你不能在任何以“s”结尾的名词上加撇号,它必须是单数。“亚当斯先生的小提琴是瓜内里琴。”这是不正确的。“亚当斯先生的小提琴是瓜内里琴。”是正确的。从技术上讲,@bratsche是正确的。是否包含“s”只取决于单词是单数还是复数,而不是它是否以“s”结尾。参见此处:Carlos的观点并不反映正确的英语。在这一点上,支持@KurtPreston。尽管有人投赞成票,Carlos是不正确的,至少在美国语法中是如此。引用:一致性是这里的关键:如果你选择不在已经以s结尾的名词后面加-s,那么在整个文本中都要一致地加-s。“没有人说在s的单数所有格结尾省略-s违反了规则——只是一个建议。正如所说的,关键是一致性。所以,你们都是对的,如果你们遵循gem的规则(省略s),很好用。就像英语中的所有东西一样,这实际上是主观的,也有例外。我知道的规则是,如果单词已经以S结尾,你只需要加一个撇号,除非你使用的是圣经中的名字,在这种情况下,你总是加上撇号+S。即沃利斯的贝斯很好,但耶稣的最后晚餐更好。这很好,但是,在Rails 3.2应用程序中,你最好在哪里添加代码呢?关于“谁”呢?关于“它”和“谁”呢?关于“它”和“谁”呢?
"Steelers".possessive # Steelers'
"Ross".possessive # Ross's
"Chris".possessive # Chris' before inflections.rb change, Chris's after