2

次のコードがあります。

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

次のようなものを出力します:

トム・バーンのエリア、またはマーク・ケリーのエリア

次のようなことを避けることができれば、それは本当に素晴らしいことです。

ジーン・コリンズのエリア、またはポール・ハリスのエリア

次のような正しい文法を使用します。

ジーン・コリンズのエリア、またはポール・ハリスのエリア

"'s Area"の最後の文字がlast_nameでない場合"s"に書き込み、そうである場合に書き込むコードを作成する方法を知っている人"' Area"はい"s"ますか?

4

5 に答える 5

3

文字列の最後の文字を取得するには: str[-1].

いくつかの特殊なケースがあるため、他の誰かがこれを行ったかどうかを調べることができます。Google で簡単に検索すると、所有格の gemが見つかりました。

于 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'"であり、所有格を文法的に行う方法ではないことに注意してください。文法的にそれを行うには、スペルではなく発音に依存します (名詞が複数か単数かも同様です)。おそらく、英語の文法を理解し、名前のデータベースを保持する、より複雑なシステムが必要になるでしょう (おそらく、いくつかのフラグメントAIの)それを行うために。

文字の位置を数えるよりも、パターン マッチングの方が適しています。

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 に答える