2009-07-12 22 views
32

Tôi muốn tạo một phương thức bổ sung cho 'foo'.titlecase mặc định sẽ thêm "sở hữu" một cách chính xác vào nó.Làm cho một đường ray uốn cho chuỗi sở hữu?

Chuỗi là tên của người dùng (< - chỉ làm một trong những quyền đó!)

Ví dụ: "sam" là người dùng <% = user.titlecase.possessive + 'Hồ sơ' %> => # Sam Hồ sơ của

Nó chỉ cần để xử lý các trường hợp cạnh như:

Hồ sơ của Steelers (nên Steelers' Profile) Ross Hồ sơ của (nên Ross Profile)

+0

Tên của người dùng được lưu trữ ở đâu? Bạn có nghĩa là nó là tên lớp? – txwikinger

+1

Trông giống như một giải pháp tối giản ở đây: http://gist.github.com/474384 – Benson

Trả lời

31

Tôi cũng cần điều này và vì vậy tôi đã thực hiện triển khai trên github và làm đá quý trên rubygem để bạn có thể đưa nó vào dự án của mình khá dễ dàng.

Trong ray 3 tất cả các bạn làm là

gem "possessive" 

và bạn sẽ có nó.

+0

Cảm ơn bạn, điều này là hoàn hảo. –

+8

Dường như đá quý này (và tất cả các bình luận khác ở đây) đang làm sai. Bạn không thể chỉ thêm một dấu nháy đơn vào bất kỳ danh từ nào kết thúc bằng 's', nó cần phải là số ít. "Ông Adams 'violon là một Guarneri." không đúng. "Violin của ông Adams là một Guarneri." đúng. – bratsche

+10

@bratsche Tôi không đồng ý. "Ý kiến ​​của Carlos là chính xác" –

14

Những gì bạn muốn là khá tầm thường để làm, cho các lớp học mở của 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 

Có thể bạn sẽ muốn đặt mã này vào plugin, để tách biệt mã này khỏi mã logic nghiệp vụ của bạn.

$ script/generate plugin Possessiveate 

Sau đó, chỉ cần thả mã vào init.rb được tạo trong thư mục của plugin. Khá nhiều tất cả các tệp được tạo khác là không cần thiết, nhưng bạn có thể quan tâm đến việc xem cấu trúc tệp mặc định.

+0

Còn "nó" và "ai"? – Rimian

21

Một rewrite nhỏ của mã BaroqueBobcat của, cho những người yêu shoulda (và những người yêu thích của các nhà điều hành ternary):

Initializer:

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

class String 
    include StringExtensions 
end 

shoulda spec:

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 

Chỉnh sửa: xem Rimian của trả lời cho câu hỏi này, xử lý đúng "ai" và "nó".

+0

Còn "nó" và "ai"? – Rimian

10

Tôi thực sự không muốn sử dụng Gem nên đã triển khai kết hợp một số câu trả lời đã có ở đây. Nhưng sau đó tôi đã thức dậy vào giữa đêm bởi việc nhận ra rằng những ví dụ này là không chính xác. Còn "ai" và "nó" thì sao? (Tiếng Anh rất khó!)

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 

Và số kỹ thuật:

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 

Lưu ý: Đây không phải là giải pháp thanh lịch nhất. Nhưng như Albert Einstein đã nói, sự sang trọng là dành cho thợ may.

+0

Điều này thật tuyệt vời, nhưng bạn nên thêm mã vào ứng dụng Rails 3.2 ở đâu? –

2

Nếu bạn nghĩ rằng điều kiện được sử dụng trong tất cả các câu trả lời này cho đến nay là không chính xác, thay vào đó bạn có thể kiểm tra xem từ đó đã được số nhiều chưa.

Vì vậy, sử dụng giải pháp Jamie Flournoy như một ví dụ, bạn có thể sử dụng self == self.pluralize thay vì 's' == self[-1, 1], và nhận được những kết quả này:

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

"Ross".pluralize đã là "Rosses", vì nó có thể được dự kiến. Nhưng "Chris".pluralize không phải là, vì vậy bạn sẽ phải thêm inflection.irregular "Chris", "Chrises" vào inflections.rb để biểu mẫu sở hữu hiển thị chính xác. Và tôi cho rằng bạn có thể phải liên tục thêm bất thường cho các từ/tên không phổ biến khác để kết thúc có các hình thức sở hữu phù hợp.

Một lần nữa điều này là nếu bạn tin tưởng rằng không đủ để kiểm tra xem chữ cái cuối của chuỗi là s.

Các vấn đề liên quan