Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对所有格字符串进行rails屈折?_Ruby On Rails - Fatal编程技术网

Ruby on rails 对所有格字符串进行rails屈折?

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

我想在默认的“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
  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