Создание перегибов рельсов для притяжательных струн?
Я хотел бы создать метод в дополнение к файлу foo'.title по умолчанию, который будет правильно добавлять к нему "собственничество".
Строка - это имя пользователя (< - просто сделало это прямо там!)
Например: "sam" - пользователь
<% = user.titlecase.possessive + 'Профиль'% >= > #Sam Profile
Ему просто нужно обрабатывать граничные случаи, например:
Профиль Steelers (должен быть профиль Steelers)
Профиль Росса (должен быть профиль Росса)
Ответы
Ответ 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.