2

我有以下代码:

<%= "#{@resource.first_name.capitalize} " + "#{@resource.last_name.capitalize}" + "'s Area" %>

打印如下内容:

汤姆伯恩的区域,或马克凯利的区域

如果我能避免这样的事情,那就太酷了:

让柯林斯区域,或保罗哈里斯区域

并使用正确的语法,例如:

让柯林斯的区域,或保罗哈里斯的区域

任何人都知道我如何编写一些代码,"'s Area"如果最后一个字母last_name不是"s",则写,"' Area"如果是则写"s"

4

5 回答 5

3

获取字符串的最后一个字符:str[-1].

您可能会查看其他人是否已这样做,因为有几种特殊情况。一个快速的谷歌搜索产生了所有格宝石

于 2013-10-23T22:05:34.610 回答
3

我会在模型中添加一个方法来处理逻辑:

class ResourceName
  def name_possessive
    last_letter = last_name[-1]
    possesive = last_letter == "s" ? "'" : "'s"

    "#{first_name} #{last_name}#{possessive}"
  end
end

然后在你看来:

<%= "#{@resource.name_possessive.capitalize}" %> Area

这段代码可以变得更简洁,但它可以工作。

于 2013-10-23T22:11:21.107 回答
2

请注意,这是如何删除"s"after的答案"s'",而不是如何在语法上执行所有格。要做到这一点在语法上取决于发音,而不是拼写(以及名词是复数还是单数),您可能需要一个更复杂的系统来理解英语语法并保存名称数据库(也许,一些片段人工智能)为了做到这一点。

模式匹配会比计算字符的位置更好。

last_name = "Kelly"
"#{last_name}'s".sub(/(?<=s')s\z/, "")
# => "Kelly's"

last_name = "Harris"
"#{last_name}'s".sub(/(?<=s')s\z/, "")
# => "Harris'"
于 2013-10-23T22:33:41.677 回答
1

你有

<%= "#{@resource.first_name.capitalize} " + "#{@resource.last_name.capitalize}" + "'s Area" %>

你需要确定resource.last_name所有格,

class ResourceName
    def poessessive(x)
        p += last_name[-1] == 's' ? "'" : "'s"
    end
end

那么你有,

<%= "#{@resource.first_name.capitalize} " + "#{@resource.last_name.capitalize}" + "#{@resource.last_name.possessive}" + " Area" %>
于 2013-10-23T22:50:45.940 回答
0

感谢您的所有帮助,都为他们 +1,因为一切都很有用。最后我在users_helper.rb中使用了:

  def resource_full_name(name)
    new_name = name + "'"
    if name.end_with?('s')
      return new_name + " Area"
    else
      return new_name + "s Area"
    end
  end
end

然后在我看来:

<%= resource_full_name(@resource.name) %>
于 2013-10-24T23:11:53.503 回答