0

私は Ruby 言語と Rails フレームワークに少し慣れていませんが、登録ページにいくつかの機能を追加したいと思っています。このコードは機能しますが、もっと単純にしてすっきりさせる必要がありますが、どこから始めればよいかわかりません。

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments
  has_many :votes

  has_secure_password validations: false

  validates :username, presence: true, on: :create, length: {minimum: 5}, uniqueness: true
  validates :username, presence: true, on: :update, length: {minimum: 5}, uniqueness: true

  validates :password, presence: true, on: :create, length: {minimum: 5}
  validates :password, presence: true, on: :update, length: {minimum: 5}

  validates_format_of :username, on: :create, with: /\A[A-Za-z\d_]+\z/, message: "can only include letters and numbers"
  validates_format_of :username, on: :update, with: /\A[A-Za-z\d_]+\z/, message: "can only include letters and numbers"
end

ユーザーがユーザー名とパスワードの両方にスペースを入れずに文字と数字のみを含めることができるようにしたいと考えています。また、両方とも 5 文字以上である必要があります。現在、作成アクションではスペースのない文字と数字のみが機能しますが、更新アクションでは機能しません。どんな助けでも大歓迎です。

4

2 に答える 2

1

これは非常に小さいモデルです。

とはいえ、大量の混乱を招いたため、改善の余地はたくさんあります。

  • on: :createおよびon: :update2 つの重複検証を指定する理由はありません。を省略すると、作成更新on:の両方に自動的に適用されます。

    # Validate on both create AND update
    validates :username, presence: true, length: { minimum: 5 }, uniquess: true 
    
  • format検証を最初の行にマージしvalidates、正規表現を劇的に単純化して だけ\A\w*\zにすることができ\wますA-Za-z0-9_

    validates :username, presence: true, length: { minimum: 5 }, uniquess: true,
                         format: { with: /\A\w*\z/ }
    
  • 検証メッセージをconfig/locals/en.ymlモデルに直接含めるのではなく、に移動する必要があります。ユーザー向けの文字列は、ソース コードにハードコードする場所はまったくなく、常にローカライズ ファイルに配置する必要があります。i18n ドキュメントを参照してください。

    # config/locals/en.yml
    activerecord:
      errors:
        models:
          user:
            attributes:
              username:
                too_short: "Your username is too short"
                too_long: "Your username is too long"
    

全体として、モデルは次のようになります (最小長だけでなく最大長の検証も指定する必要があることに注意してください)。

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments
  has_many :votes

  has_secure_password validations: false

  validates :username, presence: true,
                       length: { within: 5..20 },
                       uniqueness: true,
                       format: { with: /\A\w*\z/ }

  validates :password, presence: true,
                       length: { within: 5..20 }
end
于 2013-09-25T02:00:31.600 に答える
0
class User < ActiveRecord::Base
  has_many :posts
  has_many :comments
  has_many :votes

  has_secure_password validations: false

  validates :username, presence: true, length: {minimum: 5}, uniqueness: true

  validates :password, presence: true, length: {minimum: 5}

  validates_format_of :username, with: /\A[A-Za-z\d_]+\z/, message: "can only include letters and numbers"
end

このようなことをしたら

于 2013-09-25T00:05:28.483 に答える