9

Rails モデルで、固有名詞用のフィールドがある場合、ユーザーからの潜在的な怠惰な入力にもかかわらず、それらが均一に大文字になるようにするためのベスト プラクティスの方法は何ですか?

ContactIE では、モデルがで、フィールドが であるとしましょうName。ユーザーが何を入力しても、単語を大文字にする必要があります。つまり、モデルは次の入力を次の出力に変換します。

john doe -> John Doe
j doe -> J Doe
John doe -> John Doe
john doe jr -> John Doe Jr

では、before_saveコールバックを作成して正規表現でフィールドを変換しますか、それとも何らかの検証を作成しますか、それとも別のものを作成しますか? なぜあなたが何らかの方法でそれを行うのかという根拠に重点を置いた回答をいただければ幸いです。なぜなら、それが私が最もこだわっていることだからです。

4

4 に答える 4

18

ご希望の方法はtitleize. このcapitalizeメソッドは、文字列全体の最初の文字のみを実行するため"john doe".capitalize #=> "John doe""john doe".titleize #=> "John Doe".

それを実装する方法については、 を使用できますがbefore_save、私は疑似属性を使用して単一属性のこの種の単純な準備を行うのが好きです。基本的に、writerによって作成されたデフォルトの属性を非表示にする属性のメソッドを定義しますActiveRecordwrite_attributeメソッド ( docs )を使用して、引き続き属性にアクセスできます。このようにすると、属性を割り当てるとすぐに属性が適切に設定されます。つまり、保存する前でも、オブジェクトが有効な状態にあることを確認できます。

class Contact < ActiveRecord::Base

  def name=(s)
    write_attribute(:name, s.to_s.titleize) # The to_s is in case you get nil/non-string
  end

end
于 2012-04-18T13:49:37.617 に答える
8

@tserif のよりクリーンな表現は次のとおりです。

def name=(s)
    super s.titleize
end

これにより、依存関係がwrite_attributeなくなり、属性名を指定する必要がなくなりname、より基本的なメソッドが優先されます。to_sシンボルを割り当てる機能が必要でない限り、 の必要性はわかりません。

于 2013-02-01T22:13:23.930 に答える
4

before_save を使用することをお勧めします。

あなたのモデルのように:

before_save :capitalize_name

def capitalize_name
  self.name = self.name.split.collect(&:capitalize).join(' ') if self.name && !self.name.blank?
end
于 2012-04-18T13:40:37.823 に答える
3

最も重要な問題は、名前をどのように表示するかということです。私が推測するように、それがウェブ上にある場合、私はモデルでこれをまったく処理しません。最も簡単な解決策は、csstext-tansform: capitalize;を使用して大文字を処理することですが、頻繁に表示する場合は、デコレーターまたはヘルパー メソッドを定義して正規化することをお勧めします。

def full_name
  [first_name, last_name].map { |name| name[0].upcase + name[1..-1] }.join(' ')
end

マッピングcapitalizeする代わりに、最初の文字を大文字にするだけであることに注意してください。RJ または CJ という名前の人は、おそらく J を大文字のままにしたいと思うでしょう。

データは関係なく標準的であり、大文字の部分は純粋に表示されます。

于 2012-04-18T13:41:14.840 に答える