Делать перегибы рельсов для притяжательных струн? - PullRequest
33 голосов
/ 12 июля 2009

Я хотел бы создать метод в дополнение к стандартному 'foo'.titlecase, который будет правильно добавлять «владение» к нему.

Строка - это имя пользователя (<- только что сделал это!) </p>

Например: "sam" - это пользователь <% = user.titlecase.possessive + 'Profile'%> => # Профиль Sam *

Это просто необходимо для обработки крайних случаев, таких как:

Профиль Стилерс (должен быть Профиль Стилерс) Профиль Ross (должен быть профиль Ross)

Ответы [ 5 ]

31 голосов
/ 14 октября 2010

Мне это тоже нужно было, поэтому я сделал реализацию доступной на github и в качестве драгоценного камня на rubygems, чтобы вы могли довольно легко включить его в свой проект.

В рельсах 3 все, что вы делаете, это

gem "possessive" 

и у вас это будет.

21 голосов
/ 31 марта 2010

Незначительное переписывание кода BaroqueBobcat, для любовников Ifa (и любителей троичного оператора):

Initializer:

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

class String
  include StringExtensions
end

Должна спецификация:

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

Редактировать: см. Ответ Римиана на этот вопрос, который правильно обрабатывает слова "кто" и "это".

14 голосов
/ 12 июля 2009

То, что вы хотите, довольно тривиально, учитывая открытые классы 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 в каталоге плагина. Практически все остальные сгенерированные файлы не нужны, но вам может быть интересно посмотреть на файловую структуру по умолчанию.

13 голосов
/ 29 марта 2013

Я действительно не хотел использовать 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

И технические характеристики:

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

Примечание: это не самое элегантное решение. Но, как сказал Альберт Эйнштейн, элегантность - для портных.

2 голосов
/ 18 декабря 2013

Если вы считаете, что условие, использованное во всех этих ответах, пока неверно, вы можете вместо этого проверить, не является ли слово множественным.

Итак, используя в качестве примера решение Джейми Флурной, вы можете использовать self == self.pluralize вместо 's' == self[-1, 1] и получить следующие результаты:

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

"Ross".pluralize - это уже «Росс», как и следовало ожидать. Но "Chris".pluralize нет, поэтому вам нужно было бы добавить inflection.irregular "Chris", "Chrises" в inflections.rb, чтобы форма притяжения отображалась правильно. И я полагаю, вам, возможно, придется постоянно добавлять неровности к другим необычным словам / именам, чтобы в итоге получить правильные притяжательные формы.

Опять же, это если вы придерживаетесь другого мнения, что недостаточно проверить, является ли последняя буква строки s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...