Подтвердить что ты не робот

Создание перегибов рельсов для притяжательных струн?

Я хотел бы создать метод в дополнение к файлу foo'.title по умолчанию, который будет правильно добавлять к нему "собственничество".

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

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

Ему просто нужно обрабатывать граничные случаи, например:

Профиль Steelers (должен быть профиль Steelers) Профиль Росса (должен быть профиль Росса)

4b9b3361

Ответ 1

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

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

gem "possessive" 

и вы получите его.

Ответ 2

Небольшая переработка кода BaroqueBobcat для любителей Shoulda (и любителей тройного оператора):

Initializer:

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

Изменить: см. Rimian ответ на этот вопрос, который правильно обрабатывает "кто" и "он".

Ответ 3

То, что вы хотите, довольно тривиально делать, учитывая рубиновые открытые классы.

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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